꾸준하게 거북이처럼

백준 2108 통계학 - 정렬 단계별 알고리즘 본문

Algorithm 문제 & 공부/정렬

백준 2108 통계학 - 정렬 단계별 알고리즘

somm12 2022. 12. 19. 08:23

 

 

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

 

Comments