감자튀김 공장🍟

[백준/2108] 통계학 (with 파이썬) 본문

Algorithm/BOJ

[백준/2108] 통계학 (with 파이썬)

Potato potage 2022. 11. 12. 14:06
반응형

✔ 문제


풀이

🍩 오답 코드 (로직 실수)

import sys
from collections import Counter
input = sys.stdin.readline

n = int(input())
nums = []

for _ in range(n):
    nums.append(int(input()))
nums.sort()
count = Counter(nums).most_common()
count.sort(key=lambda x: -x[1])
median = 0

if len(count) > 1:
    median = count[1][1]
else:
    median = count[0][1]

print(round(sum(nums) / n))
print(nums[n//2])
print(median)
print(max(nums) - min(nums))

1. 이미 Counter(nums).most_common()에서 빈도수가 높은 순으로 표시되어 count에 저장이 되는데 그걸 또 count.sort로 정렬한 점..

2. if/else문에서 count 길이가 1보다 크면 count[1][1]을 출력하는데 만약 k를 10번 입력 받은 경우가 아니라면 count의 길이는 항상 1보다 크다.

    ㄴ 따라서 if/else문 구조를 아래 정답 코드처럼 바꿔야함

3. 이미 최소 ~ 최대 순서로 정렬이 되어있기 떄문에 max, min 함수를 쓸 필요가 없다.

 

 

🍟 정답 코드

import sys
from collections import Counter
input = sys.stdin.readline

n = int(input())
nums = []

for _ in range(n):
    nums.append(int(input()))
nums.sort()
count = Counter(nums).most_common()

print(round(sum(nums) / n))
print(nums[n//2])

if len(count) > 1:
    if count[0][1] == count[1][1]:
        print(count[1][0])
    else:
        print(count[0][0])
else:
	print(count[0][0])
    
print(nums[-1] - nums[0])

✔ 설명

다들 최빈값에서 많이 막혔을것이다... 일단 나부터...ㅎ

 

1. Counter(nums).most_common()으로 이미 빈도수가 높은 순으로 정렬이 되어있다. (내림차순으로)

2. count의 길이가 1보다 크고, count[0][0]과 count[1][0]의 빈도수가 같다면 두번째로 빈도순이 높은 count[1][0]을 출력한다.

    ㄴ count[n][0]이 입력 받은 숫자, count[n][1]이 빈도수이다.

3. 빈도수가 같지 않다면 최빈값은 하나이기 때문에 count[0][0]을 출력한다.

4. count의 길이가 딱 1인 경우도 있을 수 있기 때문에 else문으로 예외처리를 해준다.

    ㄴ 위에서 말했던 케이스이다. 한 숫자를 한 번 이상 입력받은 경우

 

반응형
Comments