[ 백준 / Python ] 18110 - solved.ac

 

문제출처

 

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

문제회고

절삭평균이라는 개념을 이용해 알고리즘을 구현해야하는 문제였다. 엣지 케이스에 대한 연습과 파이썬의 round 함수의 작동원리를 배울 수 있게 되었다. 게다가 시간초과를 극복하기 위해 input 대신에 sys.stdin.readline을 써야했다.

 

round() 함수

반올림이란 수가 있을 때 5보다 작으면 내리고 5와 같거나 크다면 다음 자리에 1을 더하는 개념이다. 하지만 파이썬의 round 함수는 다르게 작동한다. 수가 5보다 작으면 내리고 5보다 클 때 올리는 것은 동일하다. 하지만 수가 5일 때 처리하는 방식이 반올림 개념과 다르다. 수가 5일 때는 앞자리가 홀수일 때 내리고 짝수일 때는 올린다.

 

문제접근

input함수와  round함수를 오버라이딩했다. 엣지케이스를 대응하기 위해 로직을 함수로 구현했다.

from sys import stdin

input = stdin.readline
n = int(input().strip())


def round(my_avg):
    return int(my_avg) if my_avg - int(my_avg) < 0.5 else int(my_avg) + 1


def find_avg(n: int) -> int:
    if n == 0:
        return 0

    notion = [int(input().strip()) for x in range(n)]

    percent_15 = round(n * 15 / 100)
    percent_30 = 2 * percent_15

    notion.sort()
    my_sum = 0
    for i in range(percent_15, n - percent_15):
        my_sum += notion[i]

    return round(my_sum / (n - percent_30))


print(find_avg(n))

배운점

  • 파이썬의 round 함수는 사사오입이다.
  • 시간초과 방지를 위해 input 대신에 sys.stdin.readline을 사용하자.
  • 엣지케이스를 조심하자.