상세 컨텐츠

본문 제목

[백준] 18110 solved.ac (Baekjoon Problem 18110: solved.ac)

파이썬

by Riella 2023. 8. 18. 05:51

본문

728x90

 

문제 출처

[문제 요약]

solved.ac의 난이도 점수의 절사평균을 구하는 문제이다.

처음에 총 입력 개수 N이 주어진다.

이후 점수들이 들어오는데, 30%의 절사평균을 구하면 된다.

 

절사평균은 극단적인 값을이 평균을 왜곡하는 것을 막기 위해 가장 작은 값들과 큰 값들을 제외하고 평균을 내는 것을 말한다.

좀 쉽게 풀어쓰면 절사평균 30%를 구하라는 말은 점수중 낮은 0.15%와 높은 0.15%를 제외하고 평균을 내어야 한다.

 

단 0.15*n이 소수점도 있으므로 반올림 하여 그 인원만큼 낮은 점수와 높은 점수를 제외해야 한다.

평균도 round해서 정수로 난이도를 결정한다.

 

점수 범위는 1부터 30이하이다.


[풀이]

점수 범위가 주어졌으므로 defaultdict를 사용하였다.

d = defaultdict(int)

그리고 n만큼 룹(loop)을 돌면서 d에 점수를 넣었다.

 

이제 다시 룹을 돌리며 sum에 수를 더하는데 각 key: 1부터 30까지의 수도 룹을 돌려줘야한다 (중복된 수가 있으면 value 개수만큼 안에 룹 돌리기)

이때 count와 slim(starting limit) elim(ending limit)을 만들어주어 작은 수 몇개와 큰 수 몇개는 제외하고 더해주었다.

 

slim은 round(n*0.15 + 0.0000001)이고

elim은 n - slim이다.

count는 0이다.

따라서 count가 slim보다 같거나 크고 elim보다 작을때 sum에 더해준다.

 


[유의할 점]

  • range에 1부터 30 이므로 (1, 31)로 설정할 것
  • python의 round는 0.5초과부터이므로 round 사용시 E = 0.0000001 정도 더해주자
  • n이 0인 경우도 있어서 zero division이 나오므로 이런 경우는 따로 처리해주어야함


[파이썬 3 코드]

# -*- coding: utf-8 -*-
from sys import stdin
from collections import defaultdict

if __name__ == "__main__":
    n = int(stdin.readline())

    E = 0.0000001
    redgenum = round(n*0.15 + E)
    d = defaultdict(int)
    for i in range(n):
        inp = int(stdin.readline())
        d[inp] += 1

    slim = redgenum
    elim = n - redgenum
    count = 0
    sum = 0
    for j in range(1, 30+1):
        for k in range(d[j]):
            if slim <= count and elim > count:
                sum += j
            count += 1

    div = n-2*redgenum
    if sum == 0:
        print(0)
    else:
        avg = round(sum/div + E)
        print(avg)

관련글 더보기

댓글 영역