Python/백준

2108_통계학

728x90

문제는 더보기!

 

더보기

문제

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

  1. 산술평균 : N개의 수들의 합을 N으로 나눈 값
  2. 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
  3. 최빈값 : N개의 수들 중 가장 많이 나타나는 값
  4. 범위 : N개의 수들 중 최댓값과 최솟값의 차이

N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.

출력

첫째 줄에는 산술평균을 출력한다. 소수점 이하 첫째 자리에서 반올림한 값을 출력한다.

둘째 줄에는 중앙값을 출력한다.

셋째 줄에는 최빈값을 출력한다. 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.

넷째 줄에는 범위를 출력한다.

예제 입력 1 복사

5
1
3
8
-2
2

예제 출력 1 복사

2
2
1
10

예제 입력 2 복사

1
4000

예제 출력 2 복사

4000
4000
4000
0

예제 입력 3 복사

5
-1
-2
-3
-1
-2

예제 출력 3 복사

-2
-2
-1
2

우선 한 문제지만 크게 4문제가 합쳐진 형태이다.

 

평균, 중앙값, 범위는 쉽게 구할 수 있다.

평균은 다더한후 리스트 개수만큼 나누어 주고,

중앙값은 다 홀수이니 구하기 쉽다.

범위또한 가장 큰값에서 작은값을 빼주면 된다.

 

최빈값을 구한다고 생각하였을 경우 딕셔너리를 활용하면 어떨까 했다.

1,2,3,2,1 이 들어가면 1 : 2 , 2 : 2, 3 : 1이런식으로 말이다. 그 다음 이 값들을 정렬한 후에,

가장 많은 값이 1개이면 그값을 출력하고, 아니면 2번째 값을 출력하는 방식으로 코드를 짜 보았다.

 

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

print(round(sum(lst)/len(lst)))#평균
lst.sort()
print(lst[len(lst)//2])#중앙값

dic={}
for i in lst:
    dic[i] = lst.count(i)
max_cnt = sorted(list(dic.values()),reverse=True)[0]

m_lst= list (key for key,value in dic.items() if value == max_cnt)

print(m_lst[0] if len(m_lst)==1 else m_lst[1])

print(max(lst)-min(lst))#범위

 

뭔가 근데 불필요한 딕셔너리,리스트를 만들고 없애는 느낌이 들어 시간초과가 날꺼 같았는데 역시 시간초과가 났다... 이 이후 구글링을 통하여 이런 모듈이 있을것 같아서 찾아보았더니 있었다!

 

collections의 Counter를 사용하면 되었다.

 

Counter를 사용하면, 해당 리스트의 가장 많은값이 내가 위에 생각했던 그대로 나온다. 심지어 정렬되어 나와서 정렬작업도 필요가 없었다.

 

import sys
from collections import Counter
N = int(sys.stdin.readline())
lst = []
for _ in range(N):
    lst.append(int(sys.stdin.readline()))

print(round(sum(lst)/len(lst)))#평균
lst.sort()
print(lst[len(lst)//2])#중앙값

c_lst=Counter(lst).most_common(2)
if len(lst) > 1:
    if c_lst[0][1] == c_lst[1][1]:
        print(c_lst[1][0])
    else:
        print(c_lst[0][0])
else:
    print(c_lst[0][0])

print(max(lst)-min(lst))#범위

위 코드로 해결! Counter class은 앞으로 종종 쓸 것 같다.

728x90

'Python > 백준' 카테고리의 다른 글

11650_좌표 정렬하기  (0) 2021.12.03
1427_소트인사이드  (0) 2021.12.03
10989_수 정렬하기 3  (0) 2021.11.30
2751_수 정렬하기 2  (0) 2021.11.30
1436_영화감독 숌  (0) 2021.11.30