[python] 백준 2108 : 통계학

728x90

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

 

2108번: 통계학

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

www.acmicpc.net

난이도 : 실버 3

분류 : 구현, 정렬


백준 2108 : 통계학

 

코드

import sys
from collections import Counter

N = int(sys.stdin.readline())
lst = []
for i in range(N):
    lst.append(int(sys.stdin.readline().rstrip()))
print(round(sum(lst)/N))
lst.sort()
print((lst[(len(lst)-1) // 2]))

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

print(lst[-1] - lst[0])

대부분 최빈값 구하는 부분에서 많이 틀린 것 같습니다.

특히, 최빈값이 여러개일 때 더 작은 값을 추출해 내는게 어려웠습니다.

파이썬은 Counter 클래스를 사용하여 간단하게 최빈값을 찾아낼 수 있습니다.

 

from collections import Counter
a = ['blue', 'blue', 'red', 'green', 'red']
colors = Counter(a)
print(colors)
Counter({'blue': 2, 'red': 2, 'green': 1})

a에 포함된 값이 몇개씩 들어있는지 딕셔너리 형태로 나타냅니다. 이것은 아래 코드와 같은 기능을 합니다.

def countLetters(word):
    counter = {}
    for letter in word:
        if letter not in counter:
            counter[letter] = 0
        counter[letter] += 1
    return counter

a = ['blue', 'blue', 'red', 'green', 'red']
print(countLetters(a))
{'blue': 2, 'red': 2, 'green': 1}

 

most_common(n)은 가장 많은 것부터 n개를 나타낼 수 있습니다.

 

from collections import Counter
a = ['blue', 'blue', 'red', 'green', 'red']
colors = Counter(a)
print(colors)
print((colors.most_common()))
print(colors.most_common(2))
Counter({'blue': 2, 'red': 2, 'green': 1})
[('blue', 2), ('red', 2), ('green', 1)]
[('blue', 2), ('red', 2)]

 

728x90