평균은 넘겠지
- 시간 제한 : 1초
- 메모리 제한 : 256MB
알고리즘 분류
- 수학
- 사칙연산
문제
대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다.
입력
첫째 줄에는 테스트 케이스의 개수 C가 주어진다.
둘째 줄부터 각 테스트 케이스마다 학생의 수 N(1 ≤ N ≤ 1000, N은 정수)이 첫 수로 주어지고, 이어서 N명의 점수가 주어진다. 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.
출력
각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다. 정답과 출력값의 절대/상대 오차는 10^-3이하이면 정답이다.
풀이
1년 전에 풀었던 문제고, 평균 값을 구한 후 N명의 점수를 각각 확인해 평균을 넘는 개수를 구하는 방식으로 문제를 풀었다. 최근에 재채점 되었다길래 보았는데 맞은 문제가 틀렸다고 처리되어 어느 부분이 틀렸는지 알아보았다.
원인은 파이썬에서 round(반올림) 함수
의 오사오입(Round to Nearest Even)
방식 때문이다. 보통 우리가 반올림을 하는 방식인 사사오입(Round Off)
은, 5 이상이면 올리고 그 미만이면 내린다. 오사오입
방식은 올리려는 수가 5인 경우 앞자리가 홀수인 경우 올리고 짝수인 경우 내린다.
사진의 예시로 소수점 넷째 자리가 5일 때 셋째 자리가 2인 짝수이므로 내림 방식을 이용한 것이다.
그래서 소수점 넷째 자리가 존재할 경우 사사오입 방식으로 변환하는 코드를 작성해주었다.
소스 코드
Python
case = int(input())
for _ in range(case):
score = 0
count = 0
test = list(map(int, input().split()))
score = int(sum(test) - test[0])
avg = float(score / test[0])
for j in range(1, len(test)):
if (avg < test[j]):
count += 1
# 사사오입 방식으로 변환
roundOff = 0
if len(str(count / test[0])) > 7:
if int(str(count / test[0])[6]) % 2 == 0:
roundOff = 0.001
print(f"{round(count / test[0] * 100, 3) + roundOff:.3f}%")
Ghost