chae._.chae

[Algorithm] 백준 #2108 - 통계학 본문

파이썬 알고리즘/BOJ

[Algorithm] 백준 #2108 - 통계학

walbe0528 2022. 3. 29. 12:56
728x90
반응형

4가지 중 최빈값을 찾는 부분이 가장 어려웠다. 

 

파이썬의 collection 모듈의 Counter클래스를 사용하여 풀 수 있다. 

 

collection 모듈의 Counter클래스는 데이터의 갯수를 셀 때 유용하다. 

collection 모듈의 Counter클래스는 파이썬의 기본 자료구조인 dictionary를 확장하고 있다.

Counter 클래스는 데이터의 갯수가 많은 순서대로 배열을 리턴하는 most_common 메소드를 제공한다.

 

print(Counter('aaaaaaaaaaaaabc').most_common(1))
# 결과 : [('a', 13)]

 

예시) 주어진 단어에서 가장 많이 사용된 알파벳과 그 갯수를 구하는 코드

from collections import Counter

def find_max(word):
    counter = Counter(word)
    max_count = -1
    for letter in counter:
        if counter[letter] > max_count:
            max_count = counter[letter]
            max_letter = letter
    return max_letter, max_count

print(find_max('hello world')) # ('l', 3)

1. 반올림 함수 round를 사용한다. 

def ave(nums):
    result = sum(nums)  # 합계
    return round(result / n)  # 반올림 함수 사용.

이부분을 놓쳐서 계속 틀렸다..!

마지막 출력 예제였던 0, 0, -1을 입력한 합계가 0이 나와야 하므로, -1/3의 결과에서 반올림 시켜 0이 되게 round함수를 사용해준다. 

 

 

2. Counter로 빈도수를 카운트 해주고, 가장 많이 나온 상위 2개를 가져온다. 

 

if문 => 빈도수가 동일하면 두번째로 작은 값을 출력(이미 위에서 sort를 해줘서 정렬되어 있다!)

else => 빈도수가 동일하지 않다면 가장 빈도수가 많은 값을 출력해준다. 

def freq(nums):
    # Counter를 이용해 빈도수를 구해주고, most_common(2)를 사용하여 빈도수가 높은 숫자 2개를 가져온다
    cnt = Counter(nums).most_common(2)
    if len(nums) > 1 and cnt[0][1] == cnt[1][1]:  # 최빈값이 여러개인 경우(두개가 같음)
        return (cnt[1][0])
    else:
        return (cnt[0][0])

 

 

<Solution>

 

import sys
from collections import Counter
n = int(sys.stdin.readline())
nums=[]
for _ in range(n):
    nums.append(int(sys.stdin.readline()))

def ave(nums):
    result = sum(nums)  # 합계
    return round(result / n)  # 반올림 함수 사용.

def middle(nums):
    nums.sort()
    return nums[len(nums) // 2]

def freq(nums):
    # Counter를 이용해 빈도수를 구해주고, most_common(2)를 사용하여 빈도수가 높은 숫자 2개를 가져온다
    cnt = Counter(nums).most_common(2)
    if len(nums) > 1 and cnt[0][1] == cnt[1][1]:  # 최빈값이 여러개인 경우(두개가 같음)
        return (cnt[1][0])
    else:
        return (cnt[0][0])

def diff(nums):
    nums.sort()  # 오름차순 정렬
    return nums[len(nums)-1] - nums[0]

print(ave(nums))
print(middle(nums))
print(freq(nums))
print(diff(nums))

 

728x90

'파이썬 알고리즘 > BOJ' 카테고리의 다른 글

[Algorithm] 백준 #4963 - 섬의 개수  (0) 2022.05.20
[Algorithm] 백준 #1946 - 신입사원  (0) 2022.03.29
# 3048 - 개미  (0) 2022.01.15
#18238 - ZOAC 2  (0) 2022.01.09
#10773 - 제로  (0) 2021.12.30