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문으로 예외처리를 해준다.
ㄴ 위에서 말했던 케이스이다. 한 숫자를 한 번 이상 입력받은 경우
반응형