BOJ 4344 - 평균은 넘겠지 (Python3)
문제의 가정을 읽고 과연 그런가? 하는 생각이 들었다.
새내기라 그럴 수도 있지만, 중간고사를 마치면 90% 정도가 반에서 평균에도 못 미친다고 하기 때문.
마음이 넓은 교수들은 그래서 중간고사 성적 공시 때 반의 평균을 준다.
더 마음이 넓은 교수들은 중앙값과 표준편차도, 하해와 같은 마음씨를 가진 교수님은 사분위수까지 주신다.
제1사분위수를 넘겼다면, 기말고사에서 노려라 A+.
그럼 본격적으로 풀이에 돌입해 보자.
문제
대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다.
입력
첫째 줄에는 테스트 케이스의 개수 C가 주어진다. 둘째 줄부터 각 테스트 케이스마다 학생의 수 N(1 ≤ N ≤ 1000, N은 정수)이 첫 수로 주어지고, 이어서 N명의 점수가 주어진다. 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.
예제 입력)
5
5 50 50 70 80 100
7 100 95 90 80 70 60 50
3 70 90 80
3 70 90 81
9 100 99 98 97 96 95 94 93 91
출력
각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다.
예제 출력)
40.000%
57.143%
33.333%
66.667%
55.556%
내 코드
for _ in range(int(input())):
l = list(map(int, input().split()))
n, cnt = l.pop(0), 0
for i in range(n):
if n * l[i] > sum(l):
cnt = cnt+1
rate = 100 * cnt / n
print("{:.3f}".format(rate)+"%")
몇 번의 트라이를 거쳐 겨우겨우 성공한 코드이다. 부동소수점 문제 때문에 상당히 많이 틀려서 한때는 속이 터졌었다.
그래도 소수점 표시 방법을 배운 터라 직후 바로 맞추었지만.
입력받은 수를 리스트로 만들되, 맨 처음 수를 빼어 따로 둔다.
평균을 넘는 수의 비율을 계산한답시고 n으로 나누면 아주 자주 부동소수점 문제가 발생하기 때문에, 5번째 줄처럼 요소*갯수>평균의 n베로 조건을 두어 계산하면 절대 부동소수점 문제에 걸리지 않는다.
맨 앞의 수를 빼고 남은 리스트는 학생들의 점수로만 이루어져 있으니, 그 리스트의 총합은 정확히 평균의 n배가 됨을 활용하면 끝.
이로서 4344번의 풀이를 마친다.