https://www.acmicpc.net/problem/18110
난이도 의견 개수 n개를 바탕으로 난이도를 결정하는 문제
여기서 절사평균이란?
가장 큰 값들과 가장 작은 값들을 제외하고 평균을 내는 것을 말한다.
문제에서 제시한 30% 절사평균의 경우 위에서 15%, 아래에서 15%를 각각 제외하고 평균을 계산하면 된다.
문제를 보자마자 round()를 이용해서 문제를 해결하면 된다고 생각하여 문제를 해결했다.
import sys
input = sys.stdin.readline
n = int(input())
arr = [int(input()) for _ in range(n)]
arr.sort()
if n == 0:
print(0)
else:
val = round(n*0.15)
arr = arr[val:n-val]
print(round(sum(arr)/len(arr)))
그러나 결과는 오답(..)
우선 나는 round 함수의 문제점을 간과하고 있었다.
보통의 반올림은 사사오입이지만, 파이썬의 round 함수는 오사오입이다.
오사오입이란 올림할 숫자가 5일 경우(xx.5), 앞자리수가 홀수면 올림, 짝수면 내림하는 방식이다.
round(1.5) => 2 (올림)
round(2.5) => 2 (내림)
round(3.5) => 4 (올림)
round(4.5) => 4 (내림)
이를 해결하기 위해 round 함수를 따로 작성하였다.
def round(n):
if n - int(n) >= 0.5:
return int(n) + 1
else:
return int(n)
반올림하려는 값 n에서 n을 내림한 수를 빼, 이 값이 0.5 이상이면 올림하고 아니라면 내림하는 코드이다.
import sys
input = sys.stdin.readline
def round(n):
if n - int(n) >= 0.5:
return int(n) + 1
else:
return int(n)
n = int(input())
arr = [int(input()) for _ in range(n)]
arr.sort()
if n == 0:
print(0)
else:
val = round(n*0.15)
arr = arr[val:n-val]
print(round(sum(arr)/len(arr)))