티스토리 뷰

https://programmers.co.kr/learn/courses/30/lessons/60060?language=python3

 

코딩테스트 연습 - 가사 검색

 

programmers.co.kr

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 이분탐색으로 해결. 추후 Trie 자료구조로 요망
from bisect import bisect_left, bisect_right
 
 
def solution(words, queries):
    answer = list()
    forward = [list() for _ in range(10001)]
    backward = [list() for _ in range(10001)]
 
    for word in words:
        forward[len(word)].append(word)
        backward[len(word)].append(word[::-1])
    for i in range(10001):
        forward[i].sort()
        backward[i].sort()
 
    for query in queries:
        if query[0!= '?':
            l = bisect_left(forward[len(query)], query.replace('?''a'))
            r = bisect_right(forward[len(query)], query.replace('?''z'))
            answer.append(r - l)
        else:
            l = bisect_left(backward[len(query)], query[::-1].replace('?''a'))
            r = bisect_right(backward[len(query)], query[::-1].replace('?''z'))
            answer.append(r - l)
    return answer
cs

이분탐색으로 해결했다. Trie 자료구조를 이용해서 해결할 수 있지만, 그 방법은 추후에 2회차 풀이 때 시도하려고 한다.

bisect 라이브러리를 사용했는데, bisect_left와 right는 "정렬이 되어있다는 가정 하에" 삽입을 한다면 왼쪽, 오른쪽을 기준으로 어디에 삽입될지 찾는 함수이다. 이 함수가 이분탐색의 역할을 한다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함