[백준] 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))

혼자 공부하며 올리는 블로그입니다. 틀린 내용은 댓글 남겨주시면 감사하겠습니다.
'BAEKJOON (Python) > 단계별' 카테고리의 다른 글
BAEKJOON_1181 "단어 정렬" PYTHON (0) | 2023.03.18 |
---|---|
BAEKJOON_11651 "좌표 정렬하기 2" PYTHON (0) | 2023.03.16 |
BAEKJOON_10989 "수 정렬하기 3" PYTHON (0) | 2023.03.16 |
BAEKJOON_2751 "수 정렬하기 2" PYTHON (0) | 2023.03.15 |
BAEKJOON_25305 "커트라인" PYTHON (0) | 2023.03.09 |