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
최빈값 구하는 방법은 자주 나올 것 같으니 잘 알아놔야겠다.
'백준' 카테고리의 다른 글
[백준] 1764번: 듣보잡(파이썬) (0) | 2023.07.18 |
---|---|
[백준] 1003번 : 피보나치 함수 (파이썬) (0) | 2023.07.11 |
[백준] 1966번: 프린터 큐(파이썬) (1) | 2023.07.01 |
[백준] 18110번: solved.ac (파이썬) (0) | 2023.07.01 |
[백준] 15829번 : Hashing (파이썬) (0) | 2023.06.28 |