1 분 소요

백준 (BOJ) 11729번
https://www.acmicpc.net/problem/2108

사용언어 : PYTHON

1.문제

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

산술평균 : N개의 수들의 합을 N으로 나눈 값
중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
최빈값 : N개의 수들 중 가장 많이 나타나는 값
범위 : N개의 수들 중 최댓값과 최솟값의 차이
N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오.

2.풀이

최빈값을 구하는 것이 문제였는데,
파이썬의 내장 함수인 Collection모듈의 Counter을 사용하여 해결 할 수 있었다.

Counter함수

보통은 dictionary를 사용하여 문자열에 있는 각 알페벳의 갯수를 카운팅을 한다.

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

counterLetter('hello world')
# {'h': 1, 'e': 1, 'l': 3, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1}

이것을 Counter함수를 사용하면 쉽게 구현 할 수 있었다.

from collections import Counter

print(Counter('hello world'))

# Counter({'l': 3, 'o': 2, 'h': 1, 'e': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1})

딕셔너리 형태로 반환 되기때문에, 루프 형태로 돌릴 수 도 있다.

value='hello world'
countValue=Counter(value)
for key,value in countValue.items():
    print(key,':',value)
h : 1
e : 1
l : 3
o : 2
  : 1
w : 1
r : 1
d : 1

추가로 most_common() 메소드를 사용하여 상위요소를 반환 할 수도 있다.

from collections import Counter

print(Counter('hello world').most_common())
# [('l', 3), ('o', 2), ('h', 1), ('e', 1), (' ', 1), ('w', 1), ('r', 1), ('d', 1)]

이때 인자로 숫자 k를 넣어주면 상위 k개의 데이터를 얻을 수도 있다.

from collections import Counter

print(Counter('hello world').most_common(1))
# [('l', 3)]

3.코드

import sys
from collections import Counter

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

cnt=[]

l.sort()

print(round(sum(l)/N))
print(l[N//2])

counter_l=Counter(l).most_common()
if len(counter_l)>1 and counter_l[0][1]==counter_l[1][1]:
    print(counter_l[1][0])
else:
    print(counter_l[0][0])

print(max(l)-min(l))

댓글남기기