시간제한 : 2초
메모리 제한 : 256MB
수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다. 단, N은 홀수라고 가정하자.
N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오.
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
첫째 줄에는 산술평균을 출력한다. 소수점 이하 첫째 자리에서 반올림한 값을 출력한다.
둘째 줄에는 중앙값을 출력한다.
셋째 줄에는 최빈값을 출력한다. 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.
넷째 줄에는 범위를 출력한다.
5
1
3
8
-2
2
2
2
1
10
시간 : 576ms
메모리 : 53196KB
import sys
from collections import Counter
N = int(sys.stdin.readline().strip())
nums = []
for _ in range(N):
nums.append(int(sys.stdin.readline().strip()))
nums.sort()
# 평균값
print(round(sum(nums) / len(nums)))
# 중앙값
print(nums[len(nums) // 2])
# 최빈값
cnt = Counter(nums)
# 상위 두 개만 보기
if len(cnt) != 1:
mode = cnt.most_common(2)
if mode[0][1] == mode[1][1]:
print(mode[1][0])
else:
print(mode[0][0])
else:
mode = cnt.most_common(1)
print(mode[0][0])
# 범위
print(max(nums)-min(nums))
평균값은 간단히 반올림 함수 round
를 사용하면 된다.
중앙값은 N은 홀수라는 조건이 있으니 nums\[len(nums) // 2]
를 출력하면 된다.
이 문제의 핵심은 최빈값인데 나는 Collections
모듈의 Counter
클래스를 이용해 풀이했다.
Counter의 인자로 중복된 데이터가 저장된 list를 넘기면 각 원소마다 몇 개씩 있는지 저장된 객체를 얻게된다.
그 후, most_common()
이라는 메소드를 사용해 데이터의 개수가 많은 순으로 정렬한 list
를 return 받되, 우리가 필요한 것은 최빈값이 여러 개 있을 경우 두 번째로 작은 값
이 필요하므로 most.common(2)
까지만 리스트를 생성한다.
그렇게 코드에 적용하면 if len(N) != 1
이고, 가장 상위 최빈값 두 개가 같으면 그 중 두 번째로 작은 값 mode\[1]\[0]
을 출력해주고, 아니라면 mode\[0]\[0]
을 출력해준다.
if len(N) == 1
이라면 최빈값은 입력되는 정수이므로 그 정수를 출력해준다.
범위는 nums
의 원소 중 가장 큰 값 max(nums)
에서 가장 작은 값 min(nums)
을 빼주면 된다.