알고리즘/백준 문제풀이

[백준] 2108 통계학 파이썬 풀이 (정렬)

자바칩 프라푸치노 2021. 6. 23. 15:48

백준

 

문제풀이

  • 입력받은 숫자들을 리스트에 저장하고 크기 순서대로 정렬을 해주었다. (중앙값을 구하기 위해)
  • 산술 평균: sum을 len으로 나누고 반올림했다.
  • 중앙값: len의 나누기2의 위치에 있는 값을 출력한다.
  • 최빈값: Counter사용
    • Counter(num_list).most_common() 메소드는 num_list에서 가장 많이 들어있는 순서대로 dict형태로 출력한다.
    • 예를 들어 num_list가 [1,1,1,2,2,3]이면
    • { 1:3 , 2:2, 3:1} 이렇게 출력한다.
    • 여기서는 가장 많이 들어있는 것이 두개넘는지만 보면 되기때문에 2개까지 확인한다.
    • 첫번째 나온 빈도와 두번째 나온 빈도가 같으면 최빈값 중에서 두번째로 작은 값( mode[1][0])을 출력한다
  •  범위 : 마지막 숫자와 맨 앞 숫자를 뺀 값이다.

 

코드

import sys 
from collections import Counter
num= int(sys.stdin.readline()) #원소의 개수
num_list = []
for i in range(num):
    num_list.append(int(sys.stdin.readline().rstrip()))


num_list.sort()
#산술 평균
print(round(sum(num_list)/len(num_list))) #반올림
#중앙값
print(num_list[len(num_list)//2]) 

#최빈값
#Counter은 dict형태로 리스트에서 원소가 몇 개 나왔는지 출력한다
#most_common()메소드는 등장한 횟수를 내림차순으로 정리한다
#most_common(2)는 가장 많이 나온 수 2개만 보여준다.
mode = Counter(num_list).most_common(2) 
#print(f'mode는 {mode}')
#print(f'mode length는 {len(mode)}')
print(mode[1][0] if len(mode)>1 and mode[0][1]==mode[1][1] else mode[0][0])
#범위
print(num_list[-1]-num_list[0])
728x90