백준BOJ/Python : 4344번 평균은 넘겠지

백준BOJ/Python : 4344번 평균은 넘겠지

평균은 넘겠지

  • 시간 제한 : 1초
  • 메모리 제한 : 256MB

4344번 : 평균은 넘겠지 원본

알고리즘 분류

  • 수학
  • 사칙연산

문제

대학생 새내기들의 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}%")

이 글이 도움이 되었나요?

신고하기
0분 전
작성된 댓글이 없습니다. 첫 댓글을 달아보세요!
    댓글을 작성하려면 로그인이 필요합니다.