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

문제이해
난이도 의견 중 앞뒤로 15%를 제외하고 평균을 구하는 문제이다.
생각보다 간단한 문제라 금방 풀겠구나 했지만 이 문제에는 함정이 있었다..
파이썬에서 round함수를 사용할 때 4.5를 반올림하면 결과값이 5가 아니라 4가 된다는 것이다..!!!

문제풀이(ZeroDivisionError)
# ZeroDivisionError
n = int(input())
cut = n * 0.15
cut = int(round(cut, 0))
lv = []
for _ in range(n):
s = int(input())
lv.append(s)
lv.sort()
lv = lv[cut:n-cut]
answer = sum(lv) / len(lv)
print(int(round(answer, 0)))
첫 풀이에서는 파이썬의 round함수의 조건도 몰랐고 n이 0일 때이도 고려하지 못하여 ZeroDivisionError가 실행되었다.
문제풀이(시간초과)
# 시간초과
def my_round(x):
return int(x) + (1 if x - int(x) >= 0.5 else 0)
n = int(input())
if n == 0:
print(0)
else:
cut = my_round(n * 0.15)
lv = []
for _ in range(n):
s = int(input())
lv.append(s)
lv.sort()
lv = lv[cut:n-cut]
if len(lv) == 0:
print(0)
else:
answer = my_round(sum(lv) / len(lv))
print(answer)
위의 에러를 참고하여 수정한 코드이다.
n이 0일때, 결과값을 0으로 출력하고
15%를 절삭한 길이가 0일 때도 결과값을 0으로 출력한다.
또 파이썬의 round함수의 문제점을 고치기위해 직접 반올림하는 함수를 만들었다.(my_round() 함수)
x값을 int형으로 바꾸면 무조건 내림이 되므로 x - int(x)가 0.5이상이면 int(x)에 +1을 해주고 그렇지 않으면 +0을 해준다.
하지만 위 오류를 수정했지만 시간초과가 떴다.
문제풀이(정답)
# 정답
import sys
def my_round(x):
return int(x) + (1 if x - int(x) >= 0.5 else 0)
input = sys.stdin.readline
n = int(input())
if n == 0:
print(0)
else:
cut = my_round(n * 0.15)
lv = []
for _ in range(n):
s = int(input())
lv.append(s)
lv.sort()
lv = lv[cut:n-cut]
if len(lv) == 0:
print(0)
else:
answer = my_round(sum(lv) / len(lv))
print(answer)
import sys를 통해 시간초과를 해결해주었다.
참고로 나는 코랩에서 실행을 해보고 백준에 답을 제출하는데 코랩에서는 sys를 사용하면 오류가 난다!
'알고리즘문제풀이' 카테고리의 다른 글
| [백준/Python] 1002번 터렛 (0) | 2025.02.12 |
|---|---|
| [백준/Python] 2805번 나무 자르기 (0) | 2025.02.11 |
| [백준/Python] 10610번 30 (0) | 2025.02.07 |
| [백준/Python] 14425번 문자열 집합 (0) | 2025.02.06 |
| [백준/Python] 2003번 수들의 합 2 (0) | 2025.02.06 |
