PS/Baekjoon Online Judge

[백준 18110] solved.ac [Python]

kimyoungrok 2023. 6. 6. 04:35

백준 18110 - 문제
백준 18110 - 입/출력


풀이

정렬된 점수들의 절사평균을 구하는 문제이다.

가장 작은 15%의 인원과, 가장 큰 15%의 인원을 제외한 후 나머지 인원에 대해 평균을 구한 후 반올림을 해서 출력해주면 된다.

 

문제는 단순하지만 Python을 사용하다보니 예상치 못한 복병들이 많았다.

우선 첫 번째로 주어지는 점수들의 개수가 최대 3 x 10^5 이다. 실버 난이도의 문제답지 않게 많은 입력이 주어진다.

 

빠른 입출력을 해주자.

그 다음으로는 전체 인원에 대한 절사평균이 성립하지 않는 경우다.

즉, 인원이 너무 적어 절사평균을 구하기 위해 제외해야할 인원이 적은 경우이다.

15%에 해당하는 인원의 반올림한 값이 0보다 큰 경우에만 인원을 제외시켜 주자.

다른 하나는 Python의 round()의 작동 방식에 대한 문제다.

일반적으로 반올림이라고 하면, 0.5는 1로 올려주는 것을 생각할 것이다. 

이러한 반올림 방식을 '4사5입' 으로 반올림 자리가 4이하면 버리고, 5이상이면 올리는 방법이다.

 

하지만 이 방식은 통계학적인 측면에서 오류를 범할 수 있다.

예를 들어 각 수에 대해 반올림을 한 후 평균을 구해야 하는 상황이 주어지는 경우를 상상해보자.

 

{1.1, 1.5, 2.1}은 {1, 2, 2}이 될 것이다.

여기서 0.5에 대한 통계적 오류가 발생한다.

무수히 많은 0.5에 대해 반올림을 해준다면, 평균값은 실제값보다 큰 값을 가질 것이다.

때문에, Python의 round()는 반올림 자리가 5미만이면 버리고, 5 초과일 때는 올리지만, 5일 때는 앞자리의 홀짝을 기준으로 판단하는 방법을 사용하는 5사5입 방식을 채택했다.

Python뿐만 아니라, 공학분야에서도 유효숫자로 쓰이는 방법이라고 한다.

 

하지만, 이번 만큼은 4사 5입 방식으로 문제를 풀이해야 한다.

절사평균을 구하기 위해 인원을 제외한 후 합계를 구하고, 제외한 인원 수 만큼 남은 인원으로 나누어 평균을 구해주면 결과를 얻을 수 있다.


소스코드

소스코드 보기


출처

 

18110번: solved.ac

5명의 15%는 0.75명으로, 이를 반올림하면 1명이다. 따라서 solved.ac는 가장 높은 난이도 의견과 가장 낮은 난이도 의견을 하나씩 제외하고, {5, 5, 7}에 대한 평균으로 문제 난이도를 결정한다.

www.acmicpc.net