[Python] 백준 2108번: 통계학

민정·2023년 3월 26일

백준 풀이

목록 보기
4/17
post-thumbnail

풀이 전략은 다음과 같습니다.

수의 최댓값, 수의 최솟값, 최빈값은 입력 데이터간의 관계를 고려하지 않고, 수행 과정에서 최댓값/최솟값을 선택하는 그리디 알고리즘을 이용합니다.

최빈값은 수 n의 빈도 수를 _count[4000+n]에 저장하고,
진행 과정에서 최대 빈도 수는 count_max에, 최빈값 리스트는 mode에 저장하여 출력합니다.

import sys
N = int(sys.stdin.readline()) # 정렬할 수의 개수
l = [0 for _ in range(N)] # 정렬할 수 리스트
_sum = 0 # 수의 합
_max = -4000 # 수의 최댓값
_min = 4000 # 수의 최솟값
_count = [0 for _ in range(8001)] # _count[0]: -4000 ~ _count[8000]: 4000 개수 리스트
count_max = 0 # 최대 개수
mode = [] # 최빈값 리스트
ans = ""

for i in range(N):
    l[i] = int(sys.stdin.readline())
    _sum += l[i] # 수의 합
    if l[i] > _max: # 수의 최댓값
        _max = l[i]
    if l[i] < _min: # 수의 최솟값
        _min = l[i]
    _count[4000+l[i]] += 1 # 개수 저장
    if _count[4000+l[i]] > count_max:
        count_max = _count[4000+l[i]] # 최대 개수
        mode.clear()
        mode.append(l[i]) # 최빈값에 추가
    elif _count[4000+l[i]] == count_max:
        mode.append(l[i]) # 최빈값에 추가

ans += str(round(_sum/N))+"\n"
ans += str(sorted(l)[N//2])+"\n"
# 최빈값 출력
if len(mode) == 1:
    ans += str(sorted(mode)[0])+"\n"
else:
    ans += str(sorted(mode)[1])+"\n"
ans += str(_max - _min)

print(ans)

시간을 줄이기 위해 sys를 사용하였고, 출력할 문자열을 한번에 모아서 출력했습니다.

0개의 댓글