문제 출처
[문제 요약]
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에 더해준다.
[유의할 점]
[파이썬 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)
[백준] 4949 균형잡힌 세상 (Baekjoon Problem 4949: Balanced World) (0) | 2023.09.01 |
---|---|
[백준] 1929 소수 구하기 (Baekjoon Problem 1929: Get Prime Number) (0) | 2023.08.31 |
[백준] 11651 좌표 정렬하기 2 (Baekjoon Problem 11651: sort coordinate 2) (0) | 2023.08.18 |
[백준] 10989 수 정렬하기 3 (Baekjoon Problem 10989: Sort 3) (0) | 2023.08.17 |
[백준] 10773 제로 (Baekjoon Problem 10773: Zero) (0) | 2023.08.17 |
댓글 영역