59 lines
1.8 KiB
Python
59 lines
1.8 KiB
Python
# 영단어 암기는 괴로워
|
|
|
|
import sys
|
|
import heapq
|
|
|
|
input = sys.stdin.readline
|
|
|
|
def set_priority(words, word):
|
|
word_info = words.get(word, None)
|
|
frequency, length = 0, 0
|
|
if word_info:
|
|
frequency = -(word_info[0]) + 1
|
|
length = -(word_info[1])
|
|
else:
|
|
frequency = 1
|
|
length = len(word)
|
|
|
|
words[word] = [-frequency, -length, word, 0]
|
|
return words[word]
|
|
|
|
def solution():
|
|
n, m = map(int, input().rstrip().split())
|
|
words = {}
|
|
|
|
word_list = []
|
|
|
|
for i in range(n):
|
|
word = input().rstrip()
|
|
|
|
if len(word) < m:
|
|
continue
|
|
|
|
heapq.heappush(word_list, set_priority(words, word))
|
|
|
|
for i in range(len(word_list)):
|
|
f, l, w, is_pop = heapq.heappop(word_list)
|
|
if words.get(w)[3]:
|
|
continue
|
|
else:
|
|
print(w)
|
|
words[w][3] = 1
|
|
|
|
return
|
|
|
|
|
|
solution()
|
|
|
|
"""
|
|
걸린 시간: 35분
|
|
|
|
시간 복잡도: set_priority는 단어 길이를 세고, 정보를 dict에서 읽고 쓰는 것인데 m은 최대 10이므로 전체 시간복잡도는 O(1)이다.
|
|
solution 함수에서 n개의 단어를 보며 set_priority를 실행하고, heap에 push하므로 요소당 O(logn)이기 때문에 O(nlogn)이다.
|
|
마지막으로 word_list를 확인할 때도 heap에서 pop이므로 O(nlogn)이다. 따라서 전체 시간복잡도는 O(nlogn)이다.
|
|
|
|
해설: heap에서 정렬할 때 우선순위 3가지로 정렬하도록 리스트를 넣는다.
|
|
그러기 위해 word_info dict을 만들어서 정보 업데이트를 O(1)에 한다.
|
|
단어마다 정보를 업데이트 해가며 heap에 넣고, 다 넣은 다음 heappop 하면서 기존에 안 나온 것들만 출력을 한다.
|
|
좀 빠르게 해보겠다고 heap 써서 O(nlogn)으로 했지만 그냥 Counter 하고, 우선순위 역순으로 sort 3번 하면 이것도 O(nlogn)이다...
|
|
""" |