#78. 백준 1427번 문제 풀이: 통계학 문제 원본 보기
통계학에서 N개의 수를 대표하는 기본 통계값들은 다음과 같다. 단, N은 홀수. 1.산술평균 : 수들의 합을 N으로 나눈 값 2.중앙값 : 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값 3.최빈값 : 수들 중 가장 많이 나타나는 값 4.범위 : 수들 중 최댓값과 최솟값의 차이 N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오. 입력: 첫 줄에 수의 개수 N(1≤N≤500,000, N은 홀수). 그 다음 N개의 줄에는 정수들이 주어진다. 정수의 절댓값은 4,000을 넘지 않는다. 출력: 첫 줄에는 산술평균을 출력. 소수점 이하 첫째 자리에서 반올림. 둘째 줄에는 중앙값. 셋째 줄에는 최빈값. 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력. 넷째 줄에는 범위. * -0.3333 은 반올림하면 0이다. -0이 아닌 0으로 출력해야 한다.
입력/출력
--입력--
5
1
3
8
-2
2
--출력--
2
2
1
10
--입력--
1
4000
--출력--
4000
4000
4000
0
--입력--
5
-1
-2
-3
-1
-2
--출력--
-2
-2
-1
2
--입력--
3
0
0
-1
--출력--
0
0
0
1
문제풀이+해설
프로그램은 다음과 같은 순서로 작성하면 된다.
1. 입력된 값들을 배열에 저장한다.
2. 값들을 모두 더하고 나누어 산술평균을 출력한다.
3. 숫자 배열을 소팅을 한다.
4. 소팅된 배열에서 중간 N/2 번째 배열값(중앙값)을 출력한다.
5. 최빈값을 구해서 출력(요것은 밑에 자세히 설명)
6. 범위는 소팅된 배열에서 마지막 배열값(최댓값)에서 첫번째 배열값(최솟값)을 빼주어 출력한다.

최빈값을 구하기 이해 각 숫자들의 빈도값을 알아야 한다.
조건에서 숫자의 최대값이 4000을 넘지 않는다고 했다.
즉, 숫자의 값을 배열의 인덱스로 간주하고 배열에 카운트값을 넣는 알고리즘을 이용하라는 의미이다.
숫자의 범위가 -4000 ~ +4000 까지 이므로 8000개의 배열로 숫자 인덱스를 사용할 수 있다.
배열 인덱스는 0 부터 이므로 -값을 사용하기 위해 인덱스 4000 배열을 숫자 0으로 간주하면 된다.
즉 ns_count[4000] 값이 0의 빈도수로 보는 것이다. ns_count[40001]은 1의 빈도수....


파이썬의 경우 Counter 를 사용하면 최빈값 구하는 루틴 없이 결과값을 쉽게 얻어 올 수 있다.
파이썬에서도 배열을 이용한 루틴을 구현하려면 C나 C++ 소스를 참조하면 구현가능하다.
파이썬에서는 시간초과가 나올 수 있으므로, 입력 값을 받을 때 input() 함수 대신에 더 빠르고 단순한 sys.stdin.readline() 함수를 사용합니다. 그리고 최빈값을 구할 때 파이썬 자체에서 제공하는 Counter 를 사용하면 쉽게 구할 수 있습니다.
code sol.
import sys
from collections import Counter

N = int(sys.stdin.readline())
ns = []
for _ in range(N):
  ns.append(int(sys.stdin.readline()))

# 1.산술평균 출력
print(round(sum(ns)/N)) # 더해서 N으로 나눔.

# 2.중앙값 출력
ns.sort() # 오른차순으로 정렬
print(ns[N//2]) # 정렬된 수에서 중간에 있는 값을 출력

# 3.최빈값 출력
counts = Counter(ns).most_common() # 가장큰 빈출도의 수를 얻어옴
if len(counts) > 1 and counts[0][1] == counts[1][1]: # 최빈값이 두번째 값과 같다면 
  print(counts[1][0]) # 두번째 최빈값 출력
else:
  print(counts[0][0]) # 최빈값 출력

# 4.범위 출력
print(max(ns) - min(ns)) # 최대값에서 최솟값을 빼서 출력
© 코드솔 - CodeSol. All Rights Reserved.