[백준/Python] 18110번 solved.ac

2025. 2. 10. 14:29·알고리즘문제풀이

문제

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
'알고리즘문제풀이' 카테고리의 다른 글
  • [백준/Python] 1002번 터렛
  • [백준/Python] 2805번 나무 자르기
  • [백준/Python] 10610번 30
  • [백준/Python] 14425번 문자열 집합
jungyn
jungyn
jungyn 님의 블로그 입니다.
  • jungyn
    jungyn 님의 블로그
    jungyn
  • 전체
    오늘
    어제
    • 분류 전체보기 (36)
      • 알고리즘문제풀이 (31)
      • 제로인턴 (5)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    DP
    28278
    통계헉
    제로인턴
    카드1
    스택 2
    프로그래머스
    백준
    2606
    1847
    교점개수
    SYS
    solved.ac
    11729
    BFS
    너비우선탐색
    18110
    스택
    1629
    후기
    2108
    시간초과
    스택 수열
    2차원행렬
    2161
    2563
    다이나믹프로그래밍
    수들의 합 2
    사전직무교육
    counter
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
jungyn
[백준/Python] 18110번 solved.ac
상단으로

티스토리툴바