Algorithm (PS)

백준 알고리즘 2108 통계학 (python)

minjiwoo 2021. 7. 29. 11:04
728x90

- 계속 시간 초과가 남

- 틀린 원인 : 최빈값을 구하는 데에 너무 많은 시간 소요 

- 이를 해결할 방법... 구글링해보니까 Collection 모듈이 있음 ! 

- 파이썬 서타일은 함수로 이쁘게 쓰는건가보다 

틀린 풀이 

 

import sys
n = int(sys.stdin.readline())

numbers = []
for i in range(n):
    numbers.append(int(input()))

# 평균
sum = 0
for i in numbers:
    sum += i
print(round(sum/n, 1))

# 중앙값
sort_numbers = numbers.sort()
print(sort_numbers[len(numbers)//2])

# 최빈
count = {}
for i in range(len(numbers)):
    count[i] += 1


most = max(count.values())
max_list = []

for key, value in count.items():
    if value == most:
        max_list.append(key)

if len(max_list) > 1:
    first = min(max_list)
    max_list.remove(first)
    second = min(max_list)
    print(second)
else:
    print(min(max_list))




# 범위
a = max(numbers) - min(numbers)
print(a)

 

이게 그 시간초과 나는 풀이이다 ㅠㅠ

 

두번째 시도 ! : Collection 모듈에 최빈값 세어주는게 있다 ㅋㅋㅋ 헐 파이썬.. 

근데 이런식으로 코딩테스트 준비해도 괜찮을까 ? 파이썬에는 너무 간편한 라이브러리가 많은데 시간이 느리다

맞은 풀이 !

import sys
from collections import Counter

n = int(sys.stdin.readline())

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

# 평균
print(round(sum(numbers)/n))

# 중앙값
numbers.sort()
print(numbers[len(numbers)//2])

# 최빈
count_dict = Counter(numbers)
modes = count_dict.most_common()

if len(modes) > 1:
    if modes[0][1] == modes[1][1]:
        mod = modes[1][0]
    else:
        mod = modes[0][0]
else:
    mod = modes[0][0]

print(mod)

# 범위
a = max(numbers) - min(numbers)
print(a)

 

Counter 는 딕셔너리 형태로 각각의 요소가 몇개씩 등장했는지 세알려주고

most_common()은 최빈값을 리스트에 담긴 튜플 형태로 반환한다 !!! 

 

if 문 다음에는 최빈값이 2개 이상인경우 두번째로 작은 값을 출력해야 하는데 이미 오름차순 정렬이 되어있으므로, 

728x90