수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다. 단, N은 홀수라고 가정하자.
산술평균 : N개의 수들의 합을 N으로 나눈 값
중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
최빈값 : N개의 수들 중 가장 많이 나타나는 값
범위 : N개의 수들 중 최댓값과 최솟값의 차이
N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
출력
첫째 줄에는 산술평균을 출력한다. 소수점 이하 첫째 자리에서 반올림한 값을 출력한다.
둘째 줄에는 중앙값을 출력한다.
셋째 줄에는 최빈값을 출력한다. 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.
넷째 줄에는 범위를 출력한다.
과정
문제에서 산술평균은 반올림을 해주어야 하므로, round를 사용해주어야 한다.
중앙값을 구하기 위해 입력받은 숫자를 정렬해주어야 한다.
최빈값을 구하기 위해 딕셔너리를 사용하여 풀어준다.
마지막으로 범위는 최댓값과 최솟값의 차이이므로 max와 min을 사용해주면 된다.
예제 입력
5
1
3
8
-2
2
예제 출력
2
2
1
10
풀이
import sys
input = sys.stdin.readline
n = int(input())
nums = [int(input()) for _ in range(n)]
nums.sort()
# 산술평균
print(round(sum(nums)/n))
# 중앙값
print(nums[(n-1)//2])
# 최빈값
cnt = {}
for i in range(n):
if nums[i] not in cnt.keys():
cnt[nums[i]] = 1
else:
cnt[nums[i]] += 1
cnt = sorted(cnt.items(), key=lambda x: -x[1])
for i in range(len(cnt)):
cnt[i] = list(cnt[i])
if len(cnt) == 1 or cnt[0][1] != cnt[1][1]:
print(cnt[0][0])
else:
print(cnt[1][0])
# 범위
print(max(nums) - min(nums))
한 줄씩 해석해보기
n = int(input())
nums = [int(input()) for _ in range(n)]
nums.sort()
개수 n을 입력받는다.
배열을 입력받고 정렬해준다.
# 산술평균
print(round(sum(nums)/n))
배열의 합을 n으로 나눈 후 반올림 해준다.
# 중앙값
print(nums[(n-1)//2])
배열의 n-1//2 번째 값을 출력한다.
# 최빈값
cnt = {}
for i in range(n):
if nums[i] not in cnt.keys():
cnt[nums[i]] = 1
else:
cnt[nums[i]] += 1
최빈값을 출력할 딕셔너리를 만들어준다.
for문으로 배열을 탐색한다.
만약 딕셔너리 key값중에 배열의 숫자가 없다면
딕셔너리에 해당 값의 key값을 만들고 1을 넣어준다.
그게 아니라면 해당 key값에 1을 더해준다.
cnt = sorted(cnt.items(), key=lambda x: -x[1])
cnt value값들을 내림차순으로 정렬 후 저장해준다.
for i in range(len(cnt)):
cnt[i] = list(cnt[i])
cnt의 각 값들을 리스트화 해준다.
if len(cnt) == 1 or cnt[0][1] != cnt[1][1]:
print(cnt[0][0])
else:
print(cnt[1][0])
배열의 길이가 1이거나 배열의 첫번째와 두번째 값이 다르다면
첫번째 값을 출력한다.
그게 아니라면 두번째 값을 출력한다.
# 범위
print(max(nums) - min(nums))
배열의 가장 큰 값에서 가장 작은 값을 뺀 후 출력한다.
Counter를 이용한 풀이
# 최빈값
cnt = Counter(nums).most_common()
if len(nums) > 1:
if cnt[0][1] == cnt[1][1]:
print(cnt[1][0])
else:
print(cnt[0][0])
else:
print(cnt[0][0])