본문 바로가기

Baekjoon

[Baekjoon]백준 18110 solved.ac(실버 4) - Python

문제설명 1
문제설명 2

문제를 살펴보면 절사평균을 출력하는 문제인데, 각 소수점에 대해 반올림해야하는 조건이 추가되어있다

Python에는 round함수가 있기 때문에 이를 활용하여 코드를 작성하였다

 

먼저 정보들을 입력받는 코드를 작성해주었고 30%절사평균의 경우 앞 15%, 뒤 15%를 제외한 후에

나머지 값들에서 평균을 구하는 것이기 때문에 슬라이싱을 할 size를 구해야한다

그래서 num * 0.15를 하고 round를 해주어 정수로 변환해주었다

이후 입력받은 정보를 sort한 후에(정렬되있는 상태에서 15%를 제외해야하기 때문)이를 슬라이싱해준다

이후 슬라이싱된 리스트의 평균을 출력하도록 코드를 작성하였다

import sys
input = sys.stdin.readline

all_level = []
num = int(input())
for _ in range(num):
    op = int(input())
    all_level.append(op)
    
cutting = round(num * 0.15) # 슬라이싱할 size 추출
all_level.sort()
new_level = all_level[cutting:num - cutting]
level_avg = sum(new_level) / len(new_level)
print(round(level_avg))

그러나 런타임에러(ZeroDivisionError)가 발생한다 그래서 문제 조건도 다시 보고 round()에 대해서 찾아보니

round함수의 동작이 예상과 다르게 이루어져있었다 소수점 아래가 정확히 0.5일 때 → 짝수 쪽으로 반올림하끼 때문에

따로 함수를 선언하여야 원하는 반올림이 이루어진다

따라서 def round_new를 선언해주고 소수점 부분이 0.5이상이라면 +1, 아니라면 +0을 해주도록 하였다

또한 추가적으로 입력받는 수의 개수가 0일수도 있기때문에(문제조건) 그에 맞게 if문을 추가해주어야한다

그래야 ZeroDivisionError를 다시 한 번 보는 불상사를 막을 수 있다

import sys
input = sys.stdin.readline

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

all_level = []
num = int(input())
if num:
    for _ in range(num):
        all_level.append(int(input()))
        
    cutting = round_new(num * 0.15) # 슬라이싱할 size 추출
    all_level.sort()
    if cutting > 0:
        new_level = all_level[cutting:num - cutting]
        print(round_new(sum(new_level)/len(new_level)))
    else:
        print(round_new(sum(all_level)/len(all_level)))
else:
    print(0)