코딩

[Python] 백준 #2108. 통계학

왈왈짖는멍멍이 2023. 3. 5. 16:34

Tistory 첫 글을 써봅니다. 지금 하는 수준은 그리 높지 않아, 훗날 좀 어렵고 새로운 개념들이 나오면 다시 쓰려고 했는데 이렇게 쓰게 됐네요.

 

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

 

2108번: 통계학

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

www.acmicpc.net

# 2108 - Python3

import sys

input = sys.stdin.readline

from collections import Counter    # 최빈값 구하는 함수에 필요한 collections 모듈의 counter class

def modefinder(numbers):           # 최빈값 구하는 함수
    data_dic = Counter(numbers)
    order = data_dic.most_common()
    maximum = order[0][1]

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

n = int(input())
arr = []

for _ in range(n):
    arr.append(int(input()))

arr.sort()                          # arr를 내림차순 정리

sum = 0

for i in range(n):
    sum += arr[i]       

print("%.f" % round(sum/n))         # round function 사사오입 규칙 주의
print(arr[n//2])                    # 중앙값
if len(modefinder(arr)) > 1:        # 최빈값
    print(modefinder(arr)[1]) 
else:
    print(modefinder(arr)[0])
print(arr[n-1]-arr[0])              # 범위

< line 5 >

- from collections import Counter

: 밑의 modefinder 함수에서 Counter라는 객체를 사용하기에 선언. 여기서 Counter는 list or tuple에서 각 data의 등장횟수를     dictionary 형태로 반환

 

< line 8 >

- data_dic = Counter(numbers)

: Counter를 사용하여 각 숫자의 입력 횟수를 dictionary형태로 정리하여 data_dic에 저장

 

< line 9 >

- order = data_dic.most_common()

: most_common()을 이용하여 최빈값과 그 입력 횟수를 order에 저장

 

< line 10 >

- maximum = order[0][1]

: maximum에 최빈값의 입력 횟수 저장

 

< line 25 >

- arr.sort()

: 입력받은 arr를 오름차순으로 정렬

 

< line 32 >

- round()

: 반올림 시 사용

     ex) round(num, t): num을 t번 째 자리에서 반올림