세상을 바꾸는 데이터

[백준 2108번] 통계학 - 파이썬 본문

PS Study/BOJ(백준)

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

Industriousness 2022. 2. 3. 12:23

 

문제 링크:

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

 

2108번: 통계학

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

www.acmicpc.net

 


풀이 과정:

이 문제는 평균(mean), 중앙값(median), 최빈값(mode), 범위(range)를 출력하는 구현 문제이다.

평균과 중앙값(크기대로 순서를 정했을 때 가운데에 있는 값), 범위는 간단한 코드를 작성하여 바로 답을 구할 수 있지만, 최빈값의 경우에는 많은 코드식이 필요하다.

최빈값은 간단히 설명하면 N개의 수 중에 가장 많이 있는 값을 말한다.

예를 들어...

Case 1)
데이터가 20, 30, 10, 20, 40이 있다고 하자.
이때 20이 2개 있으므로, 최빈값은 20이다.

Case 2)
데이터가  20, 30, 10, 30, 40이 있다고 하자.
20과 30이 각각 2개씩 있으므로 둘 다 최빈값이 된다.
따라서 최빈값은 20, 30이다.

 

문제에서는 최빈값이 여러 개 있을 시에 2번째로 작은 값을 출력하라고 하였다.

다음 코드와 같이 mode_data라는 최빈값 리스트 변수를 만들어 답을 구해보자.

 

풀이 코드:

# 2108번 통계학
import sys
n = int(sys.stdin.readline())
data = []
for _ in range(n):
    data.append(int(sys.stdin.readline()))

#오름차순 정렬
data.sort()

# 평균 구하기
mean = int(sum(data))
if mean >= 0:
    print(int(sum(data) / n + 0.5))
elif mean < 0:
    print(int(sum(data) / n - 0.5))

# 중앙값 구하기
print(data[int(n/2)])

# 최빈값 구하기
## 최빈값 리스트 초기화값 생성
mode_data = [data[0]]
## 현재 숫자 개수를 세는 변수
cnt = 1
## 최빈값에 해당하는 개수 변수
cnt_max = 0
# 이전 숫자에 해당하는 변수
last = data[0]

# 숫자를 하나씩 받으면서
for i in data[1:]:
	# 이전 숫자와 현재 숫자가 불일치하고
    if i != last:
        ## 특정 수의 개수가 현재 최빈값 개수보다 많다면
        if cnt > cnt_max:
            ## 최빈값 리스트 초기화
            mode_data = []
            ## 최빈값 리스트에 추가
            mode_data.append(last)
            cnt_max = cnt
        ## 특정 수의 개수가 현재 최빈값 개수와 같다면 최빈값 추가
        elif cnt == cnt_max and last not in mode_data:
            mode_data.append(last)
        cnt = 1
    ## 중복된 수가 존재한다면 cnt 개수 추가
    else: 
        cnt += 1
    last = i

## 마지막 수 계산
if cnt > cnt_max:
    mode_data = [last]
elif cnt == cnt_max and last not in mode_data:
    mode_data.append(last)

## 최빈값이 1개라면 단일값 출력
if len(mode_data) == 1:
    print(mode_data[0])
## 최빈값이 여러개라면 두 번째로 작은 값 출력
else:
    print(mode_data[1])

# 범위 구하기
print(abs(data[-1] - data[0]))

 

문제 한줄평

최빈값을 푸는데 시간이 조금 오래 걸렸다. 상황 별 정리를 하고, 이를 코드로 구현해야 했기에 그런 것 같다.

 

백준 2108번 통계학

 

728x90
반응형
Comments