코딩테스트

백준 2108 통계학

math_tbro 2022. 1. 16. 18:58

출처 :

출처:

https://www.acmicpc.net/problem/2108

 

2108번: 통계학

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

www.acmicpc.net

 

풀이 :

from collections import Counter
import sys

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


a = sum(stat)/len(stat)
print(int(round(a,0)))

#2
stat.sort()
b = len(stat)//2
print(stat[b])

#3
cnt = Counter(stat).most_common(2)

if len(stat) > 1:
    if cnt[0][1] == cnt[1][1]:
        print(cnt[1][0])
    else:
        print(cnt[0][0])
else:
    print(cnt[0][0])

#4
d = stat[-1] - stat[0]
print(d)

시간 초과 때문에 익숙하지 않은 int(sys.stdin.readline()) 을 사용해주고 입출력은 별 다른것이 없다.

문제가 3번 빼고는 전체적으로 쉬워서 간단하게 짚고 넘어가겠다.

 

1. 반올림을 할 줄 아냐? 이게 핵심인거 같다. round(a,0) 을 쓰면 소수 첫째자리에서 반올림한다.

 

2. 이건 n이 홀수 이기 때문에 n//2 값이 딱 중앙일것이다. 그렇게 출력하면된다.'

 

4. 위에서 sort를 했기 때문에 맨뒤 [-1] 맨 앞 [0] 을 빼준다.

 

3. dictionary로 푸는 방법이 있는데.... 계속 회피하고 있다... 근데 더 좋은 내장함수가 있는데 굳이 써야하나 싶기도 해서 한번만 더 미루겠다. 

from collections import Counter

를 써서 Counter를 불러오고 

이 Counter는 리스트나 딕셔너리에 있는 값에 개수를 세주는 것이다. 

따라서 cnt를 위 같이 표현하면 

가장 많은 순서대로 2개가 [(x,y), (x2,y2)] 이렇게 출력 될것이다. 

앞으로 자주 사용할 것같다.

'코딩테스트' 카테고리의 다른 글

백준 18870 좌표 압축 - python  (0) 2022.01.17
백준 10814 나이순 정렬  (0) 2022.01.17
백준 1436 영화감독 슘  (0) 2022.01.15
백준 1018 체스판 다시 칠하기  (0) 2022.01.15
백준 7568 덩치 - python  (0) 2022.01.15