알고리즘
[백준(BOJ)] 2108번 통계학 - 파이썬/python
욘아리
2024. 1. 17. 21:49
문제
https://www.acmicpc.net/problem/2108
2108번: 통계학
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
www.acmicpc.net
홀수 n이 주어질 때, n개의 줄에는 정수들이 주어진다. 첫째 줄에는 산술평균(소수점 이하 첫째 자리에서 반올림한 값), 둘째 줄에는 중앙값, 셋째 줄에는 최빈값(여러 개 있을 때에는 최빈값 중 두 번째로 작은 값), 넷째 줄에는 범위를 출력하는 문제다.
예시
Example 1:
Input: 5
1
3
8
-2
2
Output: 2
2
1
10
Example 2:
Input: 1
4000
Output: 4000
4000
4000
0
Example 3:
Input: 5
-1
-2
-3
-1
-2
Output: -2
-2
-1
2
Example 4:
Input: 3
0
0
-1
Output: 0
0
0
1
풀이
import sys
from collections import Counter
input = sys.stdin.readline
n = int(input())
nums = [int(input()) for _ in range(n)]
nums.sort()
# 산술평균
print(round(sum(nums) / len(nums)))
# 중앙값
print(nums[len(nums) // 2])
# 최빈값
counter = Counter(nums).most_common()
max_cnt = counter[0][1]
max_list = []
for i in counter:
if i[1] == max_cnt:
max_list.append(i[0])
if len(max_list) == 1:
print(max_list[0])
else:
print(max_list[1])
# 범위
print(nums[-1] - nums[0])
- 산술평균 : 주어진 정수 리스트의 합을 리스트의 길이로 나누어 계산하고 round() 함수를 사용하여 소수점 이하 첫째 자리에서 반올림한 값을 출력한다.
- 중앙값 : 정렬된 리스트에서 리스트의 길이를 2로 나누어 가운데 위치한 값을 구한다.
- 최빈값 : Counter.most_common() 함수를 사용하여 빈도수가 높은 순서대로 정렬된 튜플 리스트를 생성한다. 최빈값의 빈도수를 저장하고, 최빈값이 여러 개일 수 있으므로 동일한 빈도수를 가지는 숫자들을 리스트에 담아준다. 최빈값이 하나라면 첫 번째 숫자를, 그렇지 않다면 두 번째로 작은 값을 출력한다.
- 범위 : 정렬된 리스트에서 가장 큰 값과 가장 작은 값의 차이를 구한다.