[백준/파이썬] 2108 - 통계학

Jungyu Jin·2022년 1월 11일
0

BackJoon

목록 보기
15/16

문제 설명

풀이 전략

문제에서 구해야하는 값 중 중앙값, 최빈값은 정렬을 해야만 구할 수 있는 값이므로 정렬을 해야하는데, 그 중 최빈값을 구하는 방법에 따라 두 가지로 구현하였다.

  1. 계수 정렬을 이용하여 빈도 수를 같이 구하고, 게수 배열을 돌며 최빈값들을 저장하여 구하기
  2. 퀵 정렬(sort())를 이용하여 정렬하고, collections 모듈의 Counter 함수를 사용하여 최빈값 구하기

2번 방법이 더 간단하지만 실행 결과를 보면 1번 방법이 메모리와 실행시간이 훨씬 효율적인 것을 볼 수 있다.

코드

1. 계수 정렬

import sys

arr=[]
counts=[]
# 입력 정수의 범위가 -4000 ~ 4000
# 파이썬 음수 인덱싱을 이용하여 8001크기의 배열 생성
countarr=[0] * 8001
for _ in range(int(input())):
    countarr[int(sys.stdin.readline().rstrip())] += 1
for i in range(-4000,4001):
    for _ in range(countarr[i]):
        arr.append(i)
print(round(sum(arr)/len(arr)))
print(arr[len(arr)//2])
# 최대 빈도 저장
maxfreq = max(countarr)
while True:
    # index()메서드는 해당하는 값이 없으면 오류 출력
    # try except문을 통해 제어한다.
    try:
        # 최대 빈도를 가진 인덱스 저장
        idx = countarr.index(maxfreq)
        # 찾은 값은 제거
        countarr[idx] = 0
        # 인덱스가 4000을 넘으면 8001을 뺀 인덱스로 본다.
        if idx > 4000:
            idx -= 8001
        counts.append(idx)
    except:
        break
counts.sort() # 저장한 최대 빈도 값들을 정렬
if len(counts) > 1:
    print(counts[1])
else:
    print(counts[0])
print(max(arr)-min(arr))

2. Counter 함수 사용

import sys
from collections import Counter

arr=[]
for _ in range(int(input())):
    arr.append(int(sys.stdin.readline().rstrip()))
arr.sort()

print(round(sum(arr)/len(arr)))
print(arr[len(arr)//2])
# 빈도수가 많은 순서대로 2개 저장
count = Counter(arr).most_common(2)
if len(count) > 1:
    # 최빈값이 2개이면 작은 것 출력
    if count[0][1] == count[1][1]:
        print(count[1][0])
    else:
        print(count[0][0])
else:
    print(count[0][0])
print(max(arr)-min(arr))

0개의 댓글