🔒 문제
수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다. 단, N은 홀수라고 가정하자.
산술평균 : N개의 수들의 합을 N으로 나눈 값
중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
최빈값 : N개의 수들 중 가장 많이 나타나는 값
범위 : N개의 수들 중 최댓값과 최솟값의 차이
N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오.
⌨ 입력
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
🖨 출력
첫째 줄에는 산술평균을 출력한다. 소수점 이하 첫째 자리에서 반올림한 값을 출력한다.
둘째 줄에는 중앙값을 출력한다.
셋째 줄에는 최빈값을 출력한다. 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.
넷째 줄에는 범위를 출력한다.
📚 예제
Ex1)
5
1
3
8
-2
2
2
2
1
10
Ex2)
1
4000
4000
4000
4000
0
Ex3)
5
-1
-2
-3
-1
-2
-2
-2
-1
2
Ex4)
3
0
0
-1
0
0
0
1
📌 풀이
다른 것은 다 정렬을 하면 풀리는 문제인데 최빈값의 경우 정렬 말고도 다른 방법을 생각해야할것 같아서 계수 정렬을 사용
그런데 수의 범위가 -4000 ~ +4000 이라서 0을 -4000이라 생각하기위해 수에 +4000을 해줬다.
계수정렬을 위해 필요한 리스트의 크기를 8002로 해서 풀었음!
🔑 python 코드
import sys
def mean(ary,N):
m=int(0)
for i in range(N):
m+=ary[i]
print("%d" %round(m/N))
def middle(ary,N):
print(ary[int(N/2)])
def mode(ary,N,max):
data = []
j=0
for i in range(8002):
if(n[i] == max):
data.append(int(i)-4000)
j+=1
if(j == 1):
print(data[0])
else:
print(data[1])
def Range(ary,N):
print(ary[N-1]-ary[0])
N = int(sys.stdin.readline())
ary=[]
n = [0]*8002
max=0
for i in range(N):
ary.append(int(sys.stdin.readline()))
n[ary[i]+4000]+=1
if(max<n[ary[i]+4000]):
max = n[ary[i]+4000]
ary.sort()
mean(ary,N)
middle(ary,N)
mode(ary,N,max)
Range(ary,N)
'BAEKJOON > 단계별로 풀어보기' 카테고리의 다른 글
[BOJ] 11651번 : 좌표 정렬하기2 (0) | 2022.09.07 |
---|---|
[BOJ] 11650번 : 좌표 정렬하기 (0) | 2022.09.06 |
[BOJ] 10989번 : 수 정렬하기3 (0) | 2022.09.04 |
[BOJ] 1427번 : 소트인사이드 (0) | 2022.09.03 |
[BOJ] 2751번 : 수 정렬하기 (★) (0) | 2022.09.01 |