꾸준하게 거북이처럼
백준 2108 통계학 - 정렬 단계별 알고리즘 본문
2108번: 통계학
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
www.acmicpc.net
평균, 중앙값, 범위는 파이썬 sort 라이브러리를 사용하면 입력값도 50만이기에 시간적 여유도 있고 금방 문제를 풀 수 있다.
하지만 최빈값은 조금 생각을 해봐야했다.
1. 한 원소에 대한 빈도수를 저장해야함.
2. 빈도 수가 같은 수가 여러개일때, 두번째로 작은 수를 출력.
해결 방안
1. 파이썬 라이브러리 counter 이용
* Counter는 리스트나 튜플에서 각 데이터가 등장한 횟수를 사전 형식으로 반환해준다.
>>> from collections import Counter
>>> colors = ['red', 'blue', 'red', 'green', 'blue', 'blue']
>>> cnt = Counter(colors)
>>> cnt
Counter({'blue': 3, 'red': 2, 'green': 1})
Counter의 most_common은 [(해당 원소, 횟수)] 와 같이, 등장한 횟수를 내림차순으로 정리하여 다음과 같이 보여준다.
>>> numbers = [1, 2, 3, 3, 4, 4, 4, 5, 5]
>>> from collections import Counter
>>> cnt = Counter(numbers)
>>> cnt.most_common()
[(4, 3), (3, 2), (5, 2), (1, 1), (2, 1)]
2. dictionary 이용.
-> 빈 딕셔너리에 key값이 입력받은 원소, value가 빈도수 로 한 쌍을 만들어서 빈도수를 저장할 수 있다.
이미 key값이 존재한다면, dic[key] += 1, 아니라면 dic[key] = 1. 이런 형식으로 구현할 수 있다.
value 값을 중심으로 sort를 하여, 여러 개일시, 두번째로 작은 수(key) 값을 찾는다.
=> 만약 이렇게 빈도수가 필요한 알고리즘 문제를 만난다면, 유용하게 쓸 수 있을 것 같다.
2108 코드
from collections import Counter
import sys
input = sys.stdin.readline
# 최빈값 배열을 반환.
def modefinder(numbers):
c = Counter(numbers)
order = c.most_common()
maximum = order[0][1]# 빈도수가 가장 큰 수의 빈도수 maximum
modes = []# 빈도수가 같은 원소를 담을 배열
for num in order:# 혹시 빈도수가 같은 원소가 여러개인지 확인.
if num[1] == maximum:
modes.append(num[0])
return modes
n = int(input())
arr = []
for _ in range(n):
arr.append(int(input()))
arr.sort()
print(round(sum(arr)/n))# 소수 첫째자리에서 반올림.
print(arr[n//2])
li = modefinder(arr)
li.sort()
if len(li) > 1:# 여러개라면, 두번째로 작은수를 구한다.
print(li[1])
else:
print(li[0])# 여러개가 아닐시, 첫번째 원소 출력.
print(arr[-1]-arr[0])
# 최빈값은 counter를 사용하여 구할 수도 있다.
참고
(파이썬) 최빈값 구하기
파이썬을 이용하여 최빈값(mode)를 구하기 위해서는 collections 모듈의 Counter 클래스를 알고 있어야 한다. Counter는 사전(dict) 클래스의 하위 클래스로 리스트나 튜플에서 각 데이터가 등장한 횟수를
codepractice.tistory.com
'Algorithm 문제 & 공부 > 정렬' 카테고리의 다른 글
파이썬 reversed (0) | 2022.09.23 |
---|---|
백준 18870번 파이썬 (0) | 2022.07.10 |
백준 10989번 - 파이썬 계수 정렬 활용하기 (0) | 2022.07.09 |
백준 1436번 파이썬 (0) | 2022.07.08 |
대표적인 정렬 알고리즘 알기 ( 선택정렬, 버블정렬, 삽입정렬, 병합정렬, 퀵정렬, 힙정렬) (0) | 2022.07.08 |