[백준/파이썬] 18110번: solved.ac

수박강아지·2025년 1월 7일

BAEKJOON

목록 보기
7/174

문제

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

풀이

난이도 의견 개수 n개를 바탕으로 난이도를 결정하는 문제

  • 아무 의견이 없다면 난이도는 0
  • 의견이 하나 이상 있다면 난이도는 난이도 의견의 30% 절사평균
  • 모든 값은 반올림하여 계산

여기서 절사평균이란?
가장 큰 값들과 가장 작은 값들을 제외하고 평균을 내는 것을 말한다.
문제에서 제시한 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)))

0개의 댓글