BOJ | Sliver | 18110번 solved.ac
문제
https://www.acmicpc.net/problem/18110
코드
import sys
def num_round(number):
if number - int(number) >= 0.5:
return int(number) + 1
else:
return int(number)
def calc_score(n, scores):
cut_qty = int(num_round(n * 0.15))
if cut_qty == 0:
pb_score = int(num_round(sum(scores) / len(scores)))
else:
pb_score = int(num_round(sum(scores[cut_qty:-cut_qty]) / len(scores[cut_qty:-cut_qty])))
return pb_score
n = int(sys.stdin.readline().rstrip())
if n == 0:
print(0)
else:
scores = []
for _ in range(n):
score = int(sys.stdin.readline().rstrip())
scores.append(score)
scores.sort()
res = calc_score(n, scores)
print(res)
풀이
이 문제는 어려운 부분은 없지만 파이썬을 이용하여 문제를 해결할 때, 반올림을 하는 round
함수를 사용한다면 주의가 필요한 문제이다. 해결 과정은 다음과 같다.
- 사용자로부터 점수를 입력받는다. 만약 점수가 아무것도 없다면(
n = 0
), 그 문제의 난이도는 0으로 결정한다. - 입력받은 난이도를 모두 하나의 리스트에 넣은 후, 오름차순으로 정렬한다.
- 정렬된 리스트에서 상위 15%와 하위 15%를 제외한 후(리스트 슬라이싱 사용) 평균 난이도를 계산한다.
num_round(number)
함수는 입력받은 숫자를 반올림하는 함수calc_score(n, scores)
함수는 난이도 계산 함수
파이썬의 round 함수
일반적으로 파이썬에서 반올림을 구현할 때, round()
함수를 많이 사용한다. 하지만 이 round()
함수는 치명적인 오류를 가지고 있는데, 살펴보면 다음과 같다.
round()
함수를 이용하여 1.5를 반올림한 값과 2.5를 반올림한 값 모두 2를 반환하는 것을 확인할 수 있다.
이러한 결과를 보이는 이유는, 파이썬의 반올림은 Banker's Rounding(은행가의 반올림) 방법을 사용하기 때문이다. 이는 우리가 알고 있는 것과 동일하게 5미만이면 버리고, 5이상이면 올리는 반올림 방법이다. 하지만 0.5의 경우에는 조금 다르게 동작하는데, 0.5인 경우에는 가장 가까운 짝수(2로 나누어질 수 있는 가장 가까운 수)로 반올림이 실행된다. 1.5와 2.5는 모두 2로 반올림이 되고, 3.5와 4.5는 모두 4로 반올림이 되는 것이다. (더 큰 숫자도 동일하게 가까운 짝수로 반올림이 실행된다)
위 문제에서 이런 문제를 해결하기 위해 num_round(number)
함수를 별도로 만들어서 우리가 알고 있는 Standard Rounding(일상적인 반올림)을 실행하여 문제를 해결한 것이다.
'Problem Solving > BOJ' 카테고리의 다른 글
BOJ | 파이썬 | Sliver | 1966번 프린터 큐 (with. max 함수의 key 파라미터 사용) (0) | 2024.05.06 |
---|---|
BOJ | 파이썬 | Sliver | 4949번 균형잡힌 세상 (with. input과 sys.stdin.readline의 차이) (0) | 2024.04.12 |
BOJ | 파이썬 | Sliver | 2164번 카드2 (feat. 2161번 카드1) (0) | 2024.04.08 |
BOJ | 파이썬 | Sliver | 10815번 숫자 카드 (0) | 2024.04.05 |
BOJ | 파이썬 | Sliver | 1920번 수 찾기 (with. 이진 탐색 알고리즘) (0) | 2024.04.05 |