[Python] 백준 18110번: solved.ac

SeungHyun·2023년 10월 9일

coding test

목록 보기
11/16

0. 기본 정보

0-A. 개요

python/백준 - 18110번 문제에 대한 분석임.

0-B. 문제 정보

백준 - 18110번: solved.ac


1. 정답 코드

import sys; input = sys.stdin.readline
from collections import deque

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

n = int(input())
l = [int(input()) for _ in range(n)]
l.sort()
l = deque(l)

per = round(n*0.15)
if n>per*2:
    for i in range(per):
        l.popleft()
        l.pop()

    print(round(sum(l)/len(l)))
else:
    print(0)

2. 핵심풀이

  1. 어려운 문제는 아니나 문제를 풀다 반올림 해야하는 경우가 있는데
    이 경우 python의 built-in함수인 round 함수는 사용이 불가능하다.
    (이유는 코드 분석에서 후술)

2-a. 코드 분석

def round(num):
    return int(num) + (1 if num-int(num)>= 0.5 else 0)
  • 해당 문제를 풀기 위해 사용할 새로운 round 함수.
    (우리가 익히 알고 있는 n.5 이상일 경우 n+1을 반환해주는 반올림 공식이다.)
  • python built-in 함수인 round 함수의 경우 round(n.5) 이와 같은 경우 n에서 가장 가까운 짝수를 반환하게 된다.
if two multiples are equally close, 
rounding is done toward the even choice 
(so, for example, both round(0.5) and round(-0.5) are 0, 
and round(1.5) is 2)
  • 실제 예시

    위와 같이 n.5 를 입력 받을 경우 올림을 하는게 아닌 가장 가까운 짝수를 반환하기에
    python의 round함수를 사용하면 문제를 해결할 수 없다.

n = int(input())
l = [int(input()) for _ in range(n)]
l.sort()
l = deque(l)
  • 문제 해결을 위한 기본적인 입력을 받는 코드이다.
  • 다양한 해법이 있겠으나 본인은 pop and popleft를 활용하기 위해 deque 객체를 만들어줬다.
    (list가 정렬되어야 하므로 sort도 해줌.)

per = round(n*0.15)
if n>per*2:
    for i in range(per):
        l.popleft()
        l.pop()

    print(round(sum(l)/len(l)))
else:
    print(0)
  • 30% 절삭평균을 구해야하므로 상위 15%/하위 15%의 값을 구하기 위해 list의 길이 n을 통해 상위/하위 몇 명을 제외 해야하는지 수를 구해준다.
  • 단, 제외한 수가 전체 list의 길이보다 길 경우 0을 반환해준다.
  • 제외한 수보다 list의 길이가 더 길 경우 상위 15%, 하위 15% 인원을 제외해주고 평균을 구하여 출력해준다.

profile
어디로 가야하오

0개의 댓글