Algorithm/Binary Search

[Python] 가사 검색

코딩쪼앙 2023. 1. 27. 12:56

문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

입력 예시

words = ["frodo", "front", "frost", "frozen", "frame", "kakao"]
queries = ["fro??", "????o", "fr???", "fro???", "pro?"]

출력 예시

[3, 2, 4, 1, 0]

문제 풀이

  • 접두사인 경우 편하게 탐색하기 위해 쿼리 뒤집어서 탐색
  • 각 단어들을 단어길이번째 인덱스에 저장 (단어 길이별로 따로 저장)
  • 접두사와 접미사 따로 탐색하기 위해 단어들을 뒤집은 상태도 저장
  • 이진탐색 진행하기 위해 각 배열들 정렬
  • 접두사와 접미사인 경우 따로 탐색 진행
    • ?를 a와 z로 치환한 후, bisect_left와 bisect_right를 사용하여 a와 z사이의 단어 개수를 구하면 와일드카드 문자가 아닌 다른 문자들이 같은지 확인할 수 있다
    • 같은문자 개수 반환하는 count_by_range 함수 따로 구현
  • 탐색 마친 후 같은 문자 개수 추가하기
  • 같은 문자 개수들 모두 출력

코드

from bisect import bisect_left,bisect_right
# words = ["frodo", "front", "frost", "frozen", "frame", "kakao"]
# queries = ["fro??", "????o", "fr???", "fro???", "pro?"]
array = [[] for _ in range(10001)]
reversed_array = [[] for _ in range(10001)]

# 값이 left_value, right_value인 값 반환하는 함수
def count_by_range(a, left_value, right_value):
    left_index = bisect_left(a,left_value)
    right_index = bisect_right(a, right_value)
    return right_index - left_index

def solution(words, queries):
    answer = []
    for word in words:
        # 접미사 탐색 위한 배열
        array[len(word)].append(word)
         # 접두사 탐색 위한 배열
        reversed_array[len(word)].append(word[::-1])

    # 이진탐색 수행하기 위해 저렬
    for i in range(10001):
        array[i].sort()
        reversed_array[i].sort()

    # 쿼리 확인하면서 탐색 진행
    for q in queries:
        # 접미사 일 때
        if q[0] != '?':
            res = count_by_range(array[len(q)], q.replace('?','a'),q.replace('?','z'))
        # 접두사 일 때
        else:
            res = count_by_range(reversed_array[len(q)], q[::-1].replace('?', 'a'), q[::-1].replace('?', 'z'))
        answer.append(res)
    return answer

# print(solution(words,queries))

'Algorithm > Binary Search' 카테고리의 다른 글

[Python] 공유기 설치  (1) 2023.01.27
[Python] 고정점 찾기  (0) 2023.01.26
[Python] 정렬된 배열에서 특정 수의 개수 구하기  (0) 2023.01.26
[Python] 떡볶이 떡 만들기  (2) 2023.01.26
[Python] 부품찾기  (0) 2023.01.26