BAEKJOON/단계별로 풀어보기

[BOJ] 2108번 : 통계학

말하는 알감자 2022. 9. 5. 14:21

🔒 문제

수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다. 단, N은 홀수라고 가정하자.

  1. 산술평균 : N개의 수들의 합을 N으로 나눈 값

  2. 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값

  3. 최빈값 : N개의 수들 중 가장 많이 나타나는 값

  4. 범위 : 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)