18110: solved.ac - Python

beaver.zip·2024년 5월 22일
0

[알고리즘] 백준

목록 보기
3/45

문제

https://www.acmicpc.net/problem/18110

풀이 1 (오답)

import sys
input = sys.stdin.readline

n = int(input())
if n == 0: # 문제의 '아직 아무 의견이 없다면 문제의 난이도는 0'
    print(0)
else:
    arr = [0] * n # arr 초기화
    for i in range(n): # 정수를 입력받아 arr에 저장
        arr[i] = int(input())
    arr.sort() # arr 정렬

    rid = round(n * 0.15) # rid = 의견 개수의 15%
    arr = arr[rid:n-rid] # 상위, 하위 15% 제거
    print(round(sum(arr)/(n-2*rid))) # 절사평균 출력

분명 아무 오류 없을 거라 생각했는데...
충격적인 반전이 있었다.

풀이 2 (정답 - 반올림 함수 정의)

import sys
input = sys.stdin.readline

def round2(num):
    return int(num) + (1 if num-int(num)>=0.5 else 0)

n = int(input())
if n == 0:
    print(0)
else:
    arr = [0] * n
    for i in range(n):
        arr[i] = int(input())
    arr.sort()

    rid = round2(n * 0.15)
    arr = arr[rid:n-rid]
    print(round2(sum(arr)/len(arr)))

반전의 정체는 바로
round() 함수는 사사오입이 아닌 오사오입(round-to-nearest-even) 이라는 것...!
이게 무슨 소리냐면..

round 함수

  • .5의 앞자리가 홀수인 경우에는 올림을, 짝수인 경우에는 내림을 한다. 예컨대,
  • round(2.5)의 결과는 3이 아닌 2이다.
  • round(3.5)의 결과는 4이다.

따라서 우리에게 익숙한 사사오입의 반올림을 하고 싶다면


오늘의 교훈

  • round 함수는 오사오입으로 동작한다.
  • round 함수를 절대 믿지 말자.
profile
NLP 일짱이 되겠다.

0개의 댓글