본문 바로가기
백준 알고리즘(BOJ)

백준 알고리즘 2018 (통계학) - python

by Think_why 2021. 7. 24.

백준 알고리즘 2018 (통계학)

> https://www.acmicpc.net/problem/2108

 

2108번: 통계학

첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.

www.acmicpc.net

 

산술평균, 중앙값, 범위는 모두 sort 후에 간단하게 해결된다.

여기서 고민할 부분은 최빈값. 게다가 생각해볼 조건도 있다.

 

먼저, 최빈값을 구하기 위해서 count에 적합한 dictionary를 활용했다.

(dictionary가 list보다 검색이 빠르다는 장점)

([from collections import Counter] 방법도 결국 dictionary의 확장)

 

1. dic={}에 각 keys(N개의 수)에 맞는 values(count 값들)을 지정.

 

2. lines 값을 dic에 대입시켜보며 max value의 key 값들만 저장.

(불필요한 반복을 줄이기 위해 set(lines)을 이용하여 중복을 제거했다.)

 

3. result를 sort시켜 2개 이상인 경우 result[1]. 아닌 경우 result[0] 출력

 

[Code]

import sys
input = sys.stdin.readline
N = int(input())
lines = [int(input().rstrip()) for _ in range(N)]
lines.sort()

# 산술평균 출력
print(round(sum(lines) / N)) # 반올림
# 중앙값 출력
print(lines[N//2]) # N은 홀수

# 최빈값 구하기
dic = {} # count에 용이한 dictionary
for line in lines:
    if line in dic: # 등록되어 있으면 value + 1
        dic[line] += 1
    else: 
        dic[line] = 1 # 없다면 등록
max_value = max(dic.values())

result = []
for line in set(lines): # 중복 제거
    if dic[line] == max_value:
        result.append(line) # max value의 key 저장
result.sort()

# 최빈값 출력
print(result[1] if len(result) > 1 else result[0]) # 2개 이상 고려
# 범위 출력
print(lines[-1] - lines[0])

 

728x90

댓글