[알고리즘] 대표값
(문제) 대표값
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번이 답이 됩니다.
해결방법
-
평균을 구한다.
-
초기화 되어있는 저장한 평균과 가까운 값이랑 비교할 현재 값이 평균과 가까운 정도를 비교하여 만약
절대값(평균 - 값)
을 하면 해당 평균에 가깝다라는 것을 의미 하는 것이므로 값이 비교하여 값이 더 작은 것의 값을 저장한 평균과 가까운 값에 해당 값을 저장한다.
(해당 값의 인덱스 또한 “저장한 평균과 가까운 값”에 최신화 시킨다, 필자가 그림으로 표현하면서 인덱스를 바꾸는 것을 까먹었다…)
- 만약에 저장한 평균과 가까운 값의 값이 현재 값 간의 평균과 가까운 정도를 비교하여 그 가깝다라는 정보가 동일 할 경우, 두 값 중에 더 큰 값을 저장한 평균과 가까운 값에 대입을 한다.
(해당 값의 인덱스 또한 “저장한 평균과 가까운 값”에 최신화 시킨다, 필자가 그림으로 표현하면서 인덱스를 바꾸는 것을 까먹었다…)
- 만약 평균과 가깝다라는 정보가 이미 저장한 평균과 가까운 값이 더 만족시키면 그냥 아무 작업을 하지 않고 넘어간다.
(해당 값의 인덱스 또한 “저장한 평균과 가까운 값”에 최신화 시킨다, 필자가 그림으로 표현하면서 인덱스를 바꾸는 것을 까먹었다…)
- 이 작업을 반복한다.
코드
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)
댓글남기기