6986번: 절사평균
첫째 줄에 절사평균(N, K)를, 둘째 줄에 보정평균(N, K)를 각각 소수점이하 셋째 자리에서 반올림하여 둘째 자리까지 출력한다. 예를 들어 결과값이 9.667인 경우 9.67로, 5인 경우 5.00으로, 5.5인 경우
www.acmicpc.net
코드
n, k = map(int, input().split())
scores = [float(input()) for _ in range(n)]
scores.sort()
# 절사평균
cutting = sum(scores[k:n-k])/(n-k*2)
# 보정평균
correct = (sum(scores[k:n-k])+scores[k]*k+scores[n-k-1]*k)/n
print("{:.2f}".format(cutting+1e-8))
print("{:.2f}".format(correct+1e-8))
분명히 맞게 풀은 것 같은데 계속 틀려서 찾아보니 부동소수점이 문제였다.
float을 4바이트로 저장할 때에는 부호에 1비트, 지수부분에 8비트, 가수 부분에 23비트를 사용하는데, 일부 실수들은 2진수로 변환했을 때 가수부분이 무한히 반복되기 때문에 여기에 다 저장될 수 없다. 그렇기 때문에 1e-8 같은 아주 작은 수를 더해서 문제를 해결해준 것이다.
'문제풀이 > 구현' 카테고리의 다른 글
[Python/파이썬] 백준 17281번 ⚾ (0) | 2024.03.30 |
---|---|
[Python/파이썬] 백준 1652번 누울 자리를 찾아라 (0) | 2024.03.12 |
[Python/파이썬] 백준 16472번 고냥이 (0) | 2024.02.26 |
[Python/파이썬] 백준 2490번 윷놀이 (0) | 2024.02.22 |
[Python/파이썬] 백준 3005번 크로스워드 퍼즐 쳐다보기 (0) | 2024.02.05 |