취준생의 코딩테스트 연습기

[백준] 2108번 통계학 파이썬(python) 본문

코딩테스트/백준

[백준] 2108번 통계학 파이썬(python)

Jiwon_C 2021. 3. 9. 02:06

# 문제 링크

www.acmicpc.net/problem/2108

 

2108번: 통계학

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

www.acmicpc.net

# Solution(실패)

최빈값을 구할때 Counter함수를 사용하지않고 소스를 작성하니 시간초과 문제 발생

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
= int(input())
 
li = []
for _ in range(n):
    li.append(int(input()))
 
 
# 산술평균 - 다 더해서 / n
print(round(sum(li)//n,1))
 
# 중앙값 - 오름차순 -> 중간값
li.sort()
print(li[n//2])
 
# 최빈값 - 빈출
# 파이썬에 Counter함수가 있으나 사용하지않음
number = list(set(li)) # 중복제거
max_fre = []
max_cnt = 0
for i in number:
    #print(i, li.count(i))
    if max_cnt == li.count(i):
        max_fre.append(i)
    elif max_cnt < li.count(i):
        max_fre = []
        max_fre.append(i)
        max_cnt = li.count(i)
if len(max_fre) > 1# 최빈값이 2개이상
    max_fre.sort()
    print(max_fre[1])
else# 최빈값 1개
    print(max_fre[0])
        
# 범위 - 최댓값-최솟값
print(max(li)-min(li))
cs

 

# Solution(성공)

입력을 받을때 input()말고 sys함수를 이용하여 받아야 시간초과 안뜸

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import sys
from collections import Counter
= int(sys.stdin.readline())
li = []
for _ in range(n):
    li.append(int(sys.stdin.readline()))
 
# 산술평균 - 다 더해서 / n
print(round(sum(li)/n))
 
# 중앙값 - 오름차순 -> 중간값
li.sort()
print(li[n//2])
 
# 최빈값 - 빈출
cnt_li = Counter(li).most_common()
if len(cnt_li) > 1 and cnt_li[0][1]==cnt_li[1][1]: #최빈값 2개 이상
    print(cnt_li[1][0])
else:
    print(cnt_li[0][0])
 
# 범위 - 최댓값-최솟값
print(max(li)-min(li))
cs

 

Comments