백준 2108번 : 통계학(python)

고갓·2021년 7월 4일
0

백준문제풀이

목록 보기
9/12

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

코드

import sys
from collections import Counter
N = int(input())
arr = []
for i in range(N):
    a = int(sys.stdin.readline())
    arr.append(a)
def mode(arr):
    c = Counter(arr)
    order = c.most_common()
    maximum = order[0][1] #제일 많이 반복된 숫자
    cnt = 0
    modes = []
    for num in order:
        if num[1] == maximum:
           cnt+=1
           modes=num[0]
        if cnt == 2:
            modes=num[0]
            return modes
    return modes
arr.sort()
u = int((N-1)/2)
avg = round((sum(arr)/N))
cen = arr[u]
ran = max(arr)-min(arr)
k = mode(arr)
print(avg)
print(cen)
print(k)
print(ran)

난잡한 코드가 만들어졌다. 일단 입력시간을 줄이기 위해서 input 대신 sys를 이용했다. 그리고 counter, most_common을 사용하기 위해 counter 클래스도 가져왔다.
평균, 중앙값, 최빈값, 범위를 구하는 문젠데 최빈값이 핵심인듯하다.
평균은 arr의 합을 구한 다음 갯수로 나누고 round를 이용해 반올림했다.
중앙값은 순서대로 나열한 뒤 홀수개만 입력된다고 했으니 9개면 0123'4'5678과 같이 리스트의 (N-1)/2 번을 출력해주었다.
범위는 단순히 리스트의 최댓값에서 최솟값을 빼주었다.
최빈값은 따로 함수를 구현하여 구했다.
most_common을 이용해 가장 많이 반복된 숫자를 찾아준 뒤 그 숫자와 같은 숫자를 for문을 통해 찾는다. 그리고 modes리스트에 넣어주고 return하는 방식으로 구했다. 최빈값이 두 개 이상일 경우에는 두번째로 작은 값을 출력해야 하기 때문에 cnt변수를 넣어줘서 cnt가 2가 되는 경우 return하도록 구현했다.

0개의 댓글