Trie는 단어들을 tree 구조에 저장하고 검색할 때 아주 빠른 자료구조이다.
아이디어가 간단해서 Trie 위키를 참고하면 알 수 있을 것이고 이 글에서는 따로 다루지 않을 것이다.
from collections import defaultdict
from bisect import bisect_left, bisect_right
def solution(words, queries):
answer = []
d = defaultdict(list) # 구현을 편하게 해준다. 모른다면 찾아보면 좋다.
r_d = defaultdict(list)
for word in words:
d[len(word)].append(word) # 길이 별로 저장
r_d[len(word)].append(word[::-1]) # 순서를 뒤집은 배열
for k in d.keys():
d[k].sort() # 이진 탐색을 위해 sort
r_d[k].sort()
for query in queries:
n = len(query)
cnt = 0
e_query = query.replace('?', 'z')
if query == '?'*n:
cnt += len(d[n])
elif query[0] == '?':
query, e_query = query[::-1], e_query[::-1] # 접두사일 때 검색어도 뒤집어주어야 한다.
l, r = bisect_left(r_d[n], query), bisect_left(r_d[n], e_query)
cnt += r-l
else:
l, r = bisect_left(d[n], query), bisect_left(d[n], e_query)
cnt += r-l
answer.append(cnt)
return answer