BAEKJOON (Python)/단계별

BAEKJOON_2108 "통계학" PYTHON

RiLLa_0511 2023. 3. 16. 11:51
728x90

[백준] 2108번 Python 파이썬

 

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

 

2108번: 통계학

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

www.acmicpc.net

 

이 문제는 최빈값을 구하는데 오랜 시간이 걸렸다,,

 

먼저 '산술평균'은 모두 더한 후 정수의 개수로 나누어서 구하고,  '중앙값'은 입력받은 정수들을 리스트에 담아 sort() 함수로 오름차순 정렬을 한 후 리스트의 중앙값을 출력해 주었다.

 

문제에서 n은 홀수라고 가정하였기 때문에 입력받은 정수 리스트에서 정수의 합을 n으로 나눈 몫의 인덱스를 출력해 주면 된다. 

 

'최빈값'을 출력하기 위해서는 ' 수 정렬하기 3 '과 마찬가지로 계수 정렬을 이용하였다!

 

계수 정렬은 범위가 한정되어 있을 때 사용할 수 있는데 입력되는 정수의 절댓값이 4000을 넘지 않는다고 하여 -4000부터 4000까지의 수를 담을 수 있는 count 배열을 만들어 주었다. 

 

그 후 입력받은 모든 정수를 모두 4000을 더한 값으로 생각하고 인덱스에 저장해 주었다. 

 

문제에서 최빈값이 여려 개 일 경우에 두 번째로 작은 값을 출력하라고 했기 때문에 mode_num이라는 리스트를 만들어 최빈값들을 담아줬습니다. (이때 최빈값들은 4000이 더해진 상태이다.)

 

최빈값을 출력하기 위해서는 최빈값이 1개인 경우와 1개가 아닌 경우로 나누어 4000을 뺀 값을 출력해 준다.

 

'범위'는 num리스트의 max값에서 min값을 뺀 값이 된다.

import sys 

n = int(sys.stdin.readline())
num = []
count = [0] * 8001 # count 배열 생성

for _ in range(n):
    a = int(sys.stdin.readline())
    num.append(a)
    count[a + 4000] += 1 # 입력받은 정수에 4000을 더한 값을 해당 인덱스에 1씩 더하기

mode = 1
for i in range(8001):
    if count[i] >= mode:
        mode = count[i] # 가장 많이 입력받은 정수의 갯수 구하기

mode_num = []
for i in range(8001):
    if count[i] == mode:
        mode_num.append(i) # 최빈값을 리스트에 담아준다.

num.sort()

# 산술평균 출력    
print(round(sum(num)/n))

# 중앙값 출력
print(num[n//2])

# 최빈값 출력
if len(mode_num) == 1:
    print(mode_num[0] - 4000)
else:
    print(mode_num[1] - 4000)

# 범위 출력
print(max(num) - min(num))

 

혼자 공부하며 올리는 블로그입니다. 틀린 내용은 댓글 남겨주시면 감사하겠습니다.