본문 바로가기

백준

[백준] 2108번: 통계학 (파이썬)

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

 

2108번: 통계학

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

www.acmicpc.net

예압

def modefinder(numbers):
  c = Counter(numbers)
  order = c.most_common()
  maximum = order[0][1]

  modes = []
  for num in order:
    if num[1] == maximum:
      modes.append(num[0])
  return modes

import sys
from collections import Counter
num = int(sys.stdin.readline())
list = []
aver = 0
for _ in range(num):
  a = int(sys.stdin.readline())
  list.append(a)
  aver += a
list.sort()
aver /= len(list)
aver = round(aver+0.00001)
mid = list[len(list)//2]


mode = modefinder(list)
if len(mode)>1:
  mode = mode[1]
else:
  mode = mode[0]

rng = list[-1] - list[0]

#print(f"aver: {aver}, mid:{mid}, mode:{mode}, rng:{rng}")
print(aver)
print(mid)
print(mode)
print(rng)

이번 문제는 값들을 입력하고 산술평균, 중앙값, 최빈값, 범위를 순서대로 출력하면 되는 문제였다.

이 넷중 산술평균, 중앙값, 범위는 쉽게 구할 수 있었는데, 최빈값을 구할 땐 어떻게 구해야할지 막막했다.

검색을 해보니 파이썬에 Counter 모듈을 이용하면 쉽게 구할 수 있었다.

modefiner는 최빈값들을 리스트 형태로 리턴하는 함수이다.

modefiner 함수를 자세히 보자.

from collections import Counter

def modefinder(numbers): #numbers는 리스트나 튜플 형태의 데이터
  c = Counter(numbers)
  order = c.most_common() #튜플 형태로 등장한 횟수를 내림차순으로 리스트에 담아짐
  maximum = order[0][1] #내림차순이므로 0번째 튜플의 1번째 요소가 최대값임
  #print(f"order:{order}")
  #print(f"maximum:{maximum}")
  modes = []
  for num in order: #모든 튜플의 1번째 요소를 최대값과 비교하고 최대값과 같으면 modes에 튜플의 0번째 요소를 추가함
    if num[1] == maximum:
      modes.append(num[0])
  return modes

최빈값 구하는 방법은 자주 나올 것 같으니 잘 알아놔야겠다.