Algorithm Study/Python

[백준 파이썬] # 2108 통계학

728x90
반응형

Silver IV

# 2108 통계학

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

 

2108번: 통계학

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

www.acmicpc.net

 

풀이

import sys
from collections import Counter

N = int(sys.stdin.readline())
li = sorted([int(sys.stdin.readline()) for i in range(N)])
c = Counter(li).most_common(2)

# 산술평균
print(round(sum(li)/len(li)))

# 중앙값
print(li[N//2])

# 최빈값
if len(c)>=2:
    if c[0][1] != c[1][1]:
        print(c[0][0])
    elif c[0][1] == c[1][1]:
        print(c[1][0])
else:
    print(c[0][0])

# 범위
print(max(li)-min(li))

 

후기

  • 최빈값을 구하는 과정이 가장 포인트인 문제였다.

  • Counter(list) 모듈을 사용해서 최빈값을 구할 수 있다.
    cf. 대문자 입력에 주의할 것

  • Counter 모듈의 most_common(n) 매서드는 가장 빈번한 값을 우선순위로 n개를 반환한다.

  • 최빈값이 여러 개 존재할 때, 최빈값의 첫 번째 값과 두 번째 값을 비교한다.
    두 값이 같다면 두 번째로 작은 값을 출력하고 같지 않다면 첫 번째 값을 출력함으로써 문제의 조건을 달성할 수 있다.

  • 최빈값이 1개만 존재할 경우 해당 값을 출력해주는 else문을 작성해야 indexerror를 방지할 수 있다.