Files
baekjoon-study/workbook_8708/silver/20920-s3.py
2026-02-23 11:14:50 +09:00

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)이다...
"""