본문 바로가기
알고리즘 테스트/백준

백준 2108 : 통계학 (파이썬)

by codeyaki 2022. 1. 31.
반응형

코드

# https://teching.tistory.com/
import sys
cnt = [0 for _ in range(8001)]
n = int(sys.stdin.readline().rstrip())
total = 0
maxN = -4000
minN = 4000
for _ in range(n):
    num = int(sys.stdin.readline().rstrip())
    cnt[num+4000] += 1
    total += num
    maxN = max(maxN, num)
    minN = min(minN, num)
mode = []
index = 0
for i in range(8001):
    num = i-4000
    if cnt[i] == max(cnt):
        mode.append(num)
    for _ in range(cnt[i]):
        if index == n//2:
            mid = num
        index += 1

print(round(total/n))
print(mid)
print(mode[1] if len(mode)>1 else mode[0])
print(maxN - minN)

해설

라이브러리를 사용하면 금방 끝낼 수 있는 문제지만 나는 직접 알고리즘을 만들어보고 싶었다.

계수 정렬 알고리즘을 응용해서 만들어보았다.

계수 정렬의 기본적인 개념은 https://teching.tistory.com/80에서 정리를 해놓았다.

 

정렬 알고리즘 3 : 계수 정렬(Counting sort)

세 번째로 알아볼 정렬 알고리즘은 바로 계수 정렬! 계수 정렬은 수의 범위가 적을 때 사용하면 좋은 정렬 알고리즘으로 배열의 가장 큰 값에 따라 시간 복잡도가 달라진다. 배열의 가장 큰 값이

teching.tistory.com

다만 단순 정렬하는게 아닌 산술평균, 중앙값, 최빈값, 범위를 구해야 하므로 각각 필요한 값인

최댓값, 최솟값, 총합, 중앙값을 구해 주었다.

1. 산술평균 : 단순하게 입력된 값들을 모두 더해주었다.

2. 중앙값 : index변수를 만들어 해당 값의 index가 배열의 크기 n의 절반 값에 해당되는 값을 찾아주었다.

3. 최빈값 : 카운트 값이 가장 높은 숫자들을 따로 배열을 만들어 저장해 두고 문제에 알맞게 처리해주었다. 

4. 범위 : 최대값 - 최솟값을 해주면 된다.

 

해당 방법으로 알고리즘을 구현시 시간은 조금 걸리지만 메모리를 많이 아낄 수 있게 된다.

반응형