이것저것 공부 기록하기

[Algorithm] 1일1솔 - 백준 2108 통계학 (python3) 본문

Algorithm/Baekjoon

[Algorithm] 1일1솔 - 백준 2108 통계학 (python3)

얍욥얍 2022. 1. 10. 13:57

문제링크

https://www.acmicpc.net/problem/2108

 

2108번: 통계학

첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.

www.acmicpc.net

 

문제설명

홀수 N개의 값들에 대해 산술평균, 중앙값, 최빈값, 범위를 차례로 구하는 문제로 까다로운 조건이 없었다.

최빈값이 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력해야 하는 조건이 주어졌다.

이 조건에 대해서는 Counter의 most_common으로 2개까지만 구한 후 케이스를 구분하는 방식을 취했다.

 

most_common으로 최빈값을 구한다면, 중앙값 뿐 아니라 최빈값에 대해서도 정렬을 먼저 고려해야 했기 때문에 입력받은 값들을 담은 배열을 바로 sort로 정렬해주었다. most_common은 각 값마다의 크기는 고려하지 않고 최빈값만 고려하기 때문에, 순서를 고려하여 출력하려면 먼저 정렬을 해주어야 한다.

most_common으로 구한 두 요소의 빈도값이 같으면 두 번째로 작은 값을 출력했으며, 빈도값이 다르면 most_common으로 구한 가장 앞 요소를 출력했다. (일반적인 most_common으로는 최빈값이 가장 큰 순서대로 구해지기 때문이다.)

 

또한, 최빈값은 주어지는 요소 자체가 1개인 경우(ex. [4000])나 모든 값이 같을 경우(ex. [1,1,1])를 예외 처리하기 위해 2개 이상으로 구해졌을 경우만 고려하였다.

시간초과 방지를 위해 입력값은 sys.stdin.readline()으로 받았다.

 

문제풀이

import sys
from collections import Counter

n = int(sys.stdin.readline())
tmp = []
for _ in range(n):
    tmp.append(int(sys.stdin.readline()))
tmp.sort() # 정렬

# 최빈값 구하기
common = Counter(tmp).most_common(2)
if len(common)==2 and common[0][1] == common[1][1]:  # 최빈값이 2개가 구해졌을 경우, 두 요소의 빈도수 비교
    common = max(common[0][0],common[1][0])
else:
    common = common[0][0]

# 차례대로 출력
print(round(sum(tmp)/n), tmp[n//2], common,tmp[-1]-tmp[0],sep='\n')

반응형
Comments