[알고리즘] 대표값

(문제) 대표값


N명의 학생의 수학점수가 주어집니다.

N명의 학생들의 평균(소수 첫째자리 반올림)을 구하고, N명의 학생 중 평균에 가장 가까운 학생은 몇 번째 학생인지 출력하는 프로그램을 작성하세 요.

평균과 가장 가까운 점수가 여러 개일 경우 먼저 점수가 높은 학생의 번호를 답으로 하고, 높은 점수를 가진 학생이 여러 명일 경우 그 중 학생번호가 빠른 학생의 번호를 답으로 합니다.

입력설명

첫줄에 자연수 N(5<=N<=100)이 주어지고, 두 번째 줄에는 각 학생의 수학점수인 N개의 자연수가 주어집니다.

학생의 번호는 앞에서부터 1로 시작해서 N까지이다.

출력설명

첫줄에 평균과 평균에 가장 가까운 학생의 번호를 출력한다.

평균은 소수 첫째 자리에서 반올림합니다.

테스트케이스

입력예제 출력예제
10
45 73 66 87 92 67 75 79 75 80
74 7
15
12 34 17 6 11 15 27 42 39 31 25 36 35 25 17
25 11
20
13 34 17 6 11 15 27 42 39 31 25 36 32 25 17 45 67 89 24 65
33 2
[테스트 케이스 입력 예제 첫번째 기준으로 예제설명]

평균이 74점으로 평균과 가장 가까운 점수는 73(2번), 75(7번), 75(9번)입니다.

여기서 점수가 높은 75(7번), 75(9번)이 답이 될 수 있고, 75점이 두명이므로 학생번호가 빠른 7번이 답이 됩니다.

해결방법

  1. 평균을 구한다.

  2. 초기화 되어있는 저장한 평균과 가까운 값이랑 비교할 현재 값이 평균과 가까운 정도를 비교하여 만약 절대값(평균 - 값)을 하면 해당 평균에 가깝다라는 것을 의미 하는 것이므로 값이 비교하여 값이 더 작은 것의 값을 저장한 평균과 가까운 값에 해당 값을 저장한다.
    (해당 값의 인덱스 또한 “저장한 평균과 가까운 값”에 최신화 시킨다, 필자가 그림으로 표현하면서 인덱스를 바꾸는 것을 까먹었다…)

  1. 만약에 저장한 평균과 가까운 값의 값이 현재 값 간의 평균과 가까운 정도를 비교하여 그 가깝다라는 정보가 동일 할 경우, 두 값 중에 더 큰 값을 저장한 평균과 가까운 값에 대입을 한다.
    (해당 값의 인덱스 또한 “저장한 평균과 가까운 값”에 최신화 시킨다, 필자가 그림으로 표현하면서 인덱스를 바꾸는 것을 까먹었다…)

  1. 만약 평균과 가깝다라는 정보가 이미 저장한 평균과 가까운 값이 더 만족시키면 그냥 아무 작업을 하지 않고 넘어간다.
    (해당 값의 인덱스 또한 “저장한 평균과 가까운 값”에 최신화 시킨다, 필자가 그림으로 표현하면서 인덱스를 바꾸는 것을 까먹었다…)

  1. 이 작업을 반복한다.


코드

n = int(input())
students = list(map(int, input().split()))

check_score = 0
count = 0

# 평균
average = round(sum(students) / len(students), 0)

for i in range(len(students)):
    # 만약 0에 가까운 값이 둘다 같을 경우
    if abs(average - check_score) == abs(average - students[i]):
        if check_score < students[i]:
            check_score = students[i]    
            count = i + 1
    # 만약 0과 더 가까운 것을 만났을 경우
    elif abs(average - check_score) >= abs(average - students[i]):
        check_score = students[i]
        count = i + 1

print(int(average), count)

댓글남기기