문제 출처 : https://www.acmicpc.net/problem/2108
왜 정렬인지 모르겠지만 암튼 정렬문제
최빈값을 구하는 부분에서 상당히 애를 먹었었다. 어떻게 진행을 해야 최빈값을 도출할 수 있을지 꽤 오래 고민했다. 그러다 파이썬은 파이썬답게 풀자! Counter를 이용해야 겠단 생각을 했다.
Counter
와 defaultdict
를 이용하여 빈도수를 value
로 하는 Counter를 생성했다.
key를 이용하여 이 value( 빈도 수 )들을 다시 key로 하는 defaultdict를 생성한뒤, 각 숫자들을 key( 빈도 수 )에 추가했다.
import sys
from collections import Counter
from collections import defaultdict
N = int(sys.stdin.readline().rstrip("\n"))
num = [int(sys.stdin.readline().rstrip("\n")) for _ in range(N)]
num.sort()
print(round(sum(num)/N))
print(num[len(num)//2])
many = Counter(num)
mode=defaultdict(list)
for i in many.keys() :
mode[many[i]].append(i)
max_n = max(mode)
if len(mode[max_n])!=1 :
mode[max_n].sort()
print(mode[max_n][1])
else:
print(mode[max_n][0])
print(max(num)-min(num))
사실 최빈값에서 제일 많이 고민했는데 최빈값때문에 틀린것은 아니었다.
1. 문제를 제대로 해석하지 못함. sum(num)//N => 바로 정수가 되버림. 반올림을 시도 할수가 없음. 그래서 sum(num)/N이라고 작성해야 했다.
2. sort는 오름차순으로 정렬된다. 순간 헷갈려서 index를 잘못 작성했다.
다른 사람의 풀이(jinistic 님)를 보면 num을 index로 하는 list ( 모든 value = 0 )를 이용해 count하여 최빈값을 구했다. ( 이렇게 하면 메모리를 더 쓰지 않을까? 그렇지도 않다. 오히려 훨씬 메모리도 적게썼다... 뭐지? defaultdict가 메모리 할당을 많이 하나? )
> 실제로 defaultdict로 인해 메모리 초과가 나는 케이스가 존재한다. defaultdict의 원론적인 구조를 공부해야 list라던가 다른 것과 비교하여 공부할수 있을듯