[구현] (2-4) 평균과 편차

2024. 6. 11. 21:15개발의 흔적/코딩테스트

문제:  대표값

N명의 학생의 수학점수가 주어집니다. N명의 학생들의 평균(소수 첫째자리 반올림)을 구하고, N명의 학생 중 평균에 가장 가까운 학생은 몇 번째 학생인지 출력하는 프로그램을 작성하세 요.
평균과 가장 가까운 점수가 여러 개일 경우 먼저 점수가 높은 학생의 번호를 답으로 하고, 높은 점수를 가진 학생이 여러 명일 경우 그 중 학생번호가 빠른 학생의 번호를 답으로 합니다.

<입력설명>
첫줄에 자연수 N(5<=N<=100)이 주어지고, 두 번째 줄에는 각 학생의 수학점수인 N개의 자연 수가 주어집니다. 학생의 번호는 앞에서부터 1로 시작해서 N까지이다.

<출력설명>
첫줄에 평균과 평균에 가장 가까운 학생의 번호를 출력한다. 평균은 소수 첫째 자리에서 반올림합니다.

입력예제

10

45 73 66 87 92 67 75 79 75 80

출력예제

74 7

예제설명)
평균이 74점으로 평균과 가장 가까운 점수는 73(2번), 75(7번), 75(9번)입니다. 여기서 점수가 높은 75(7번), 75(9번)이 답이 될 수 있고, 75점이 두명이므로 학생번호가 빠른 7번이 답이 됩니다.

 

 

1. 평균구하기

2. 각 점수의 평균과의 편차 구하고, 편차의 절대값이 작은값 갱신

    - 편차의 절대값이 같다면, 음양을 따진다 

 

import sys
from sys import maxsize
import math
input = sys.stdin.readline

N = int(input())
score_list = list(map(int, input().split()))

avg = round(sum(score_list)/N)
# avg = int(avg) if -0.5<= avg-int(avg) < 0.5 else int(avg)+1

min_gap_index = 0
min_gap = maxsize
for i, score in enumerate(score_list):
    gap = score - avg
    if abs(gap) < abs(min_gap):
        min_gap = gap
        min_gap_index = i
    if abs(gap) == abs(min_gap):
        if gap > min_gap:
            min_gap = gap
            min_gap_index = i

print(avg, min_gap_index+1)

 

갱신시 따져야 할 것

1. 현재_편차의_절댓값 vs 기존_갱신값의_절댓값

  현재 편차가 작을때 : 무조건 현재것 갱신

 같을 때:  기존_갱신값이 양수일때 -> pass  기존_갱신값이 음수일때 -> 현재-편차가 양수면 갱신

 

round()함수를 몰라서 

avg = int(avg) if -0.5<= avg-int(avg) < 0.5 else int(avg)+1

를 사용했는데, 외우자!!