코딩 테스트/Level 4

2020 KAKAO BLIND RECRUITMENT 가사 검색

컴닥 2022. 12. 4. 22:06
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/60060

BF로 확인.. 

def solution(words, queries):
    import re
    answer = [0] * len(queries)
    for index, query in enumerate(queries):
        q = re.compile(f"^{query}$".replace("?", "."))
        for word in words:
            if q.search(word) is not None:
                answer[index] += 1
    return answer

당연히.. 

정확성  테스트
테스트 1 〉	통과 (1.79ms, 10.3MB)
테스트 2 〉	통과 (1.12ms, 10.2MB)
테스트 3 〉	통과 (1.21ms, 10.1MB)
테스트 4 〉	통과 (1.34ms, 10.1MB)
테스트 5 〉	통과 (1.40ms, 10.2MB)
테스트 6 〉	통과 (1.39ms, 10.2MB)
테스트 7 〉	통과 (16.88ms, 10.3MB)
테스트 8 〉	통과 (20.25ms, 10.2MB)
테스트 9 〉	통과 (23.47ms, 10.4MB)
테스트 10 〉	통과 (14.94ms, 10.2MB)
테스트 11 〉	통과 (14.20ms, 10.3MB)
테스트 12 〉	통과 (17.09ms, 10.3MB)
테스트 13 〉	통과 (222.45ms, 10.5MB)
테스트 14 〉	통과 (191.67ms, 10.6MB)
테스트 15 〉	통과 (225.41ms, 10.4MB)
테스트 16 〉	통과 (212.51ms, 10.5MB)
테스트 17 〉	통과 (188.19ms, 10.6MB)
테스트 18 〉	통과 (233.41ms, 10.6MB)
효율성  테스트
테스트 1 〉	실패 (시간 초과)
테스트 2 〉	실패 (시간 초과)
테스트 3 〉	실패 (시간 초과)
테스트 4 〉	통과 (499.61ms, 15.1MB)
테스트 5 〉	통과 (1274.58ms, 19.8MB)

Trie 
중간에 '?'가 나와도 검색이 되도록 재귀로 만들어 보았다. 
문제 조건에서도 재귀의 한계를 넘기는 숫자들이 보인다. 
될리가 없다.

class Trie:
    def __init__(self):
        self.root = {}

    def insert(self, word):
        current = self.root
        for letter in word:
            current.setdefault(letter, {})
            current = current[letter]
        current['*'] = word

    def search(self, word, index=0, current=None, match=0):
        if current is None:
            current = self.root
        if index == len(word):
            return match + 1 if '*' in current else match
        letter = word[index]
        if letter in current:
            match = self.search(word, index + 1, current[letter], match)
        elif letter == '?':
            for letter in current:
                match = self.search(word, index + 1, current[letter], match)
        return match


def solution(words, queries):
    import sys
    sys.setrecursionlimit(1_000_000)
    trie = Trie()
    for word in words:
        trie.insert(word)
    return [trie.search(query) for query in queries]

Trie를 글자수 별로 만들어서 같은 글자수끼리 비교한다. 

class Node:
    def __init__(self):
        self.count = 0
        self.children = {}


class Trie:
    def __init__(self):
        self.root = Node()

    def insert(self, word):
        current = self.root
        current.count += 1
        for letter in word:
            if letter not in current.children:
                current.children[letter] = Node()
            current = current.children[letter]
            current.count += 1
        current.children['*'] = word

    def search(self, word):
        current = self.root
        for letter in word:
            if letter not in current.children:
                return 0
            current = current.children[letter]
        return current.count


def solution(words, queries):
    tries = {}
    r_tries = {}
    for word in words:
        tries.setdefault(len(word), Trie())
        r_tries.setdefault(len(word), Trie())
        tries[len(word)].insert(word)
        r_tries[len(word)].insert(word[::-1])
    return [search_helper(tries, r_tries, query) for query in queries]


def search_helper(tries, r_tries, query):
    modified_query = query.replace('?', '')
    if len(query) not in tries:
        return 0
    if query[0] != '?':
        return tries[len(query)].search(modified_query)
    if query[-1] == '?':
        return tries[len(query)].root.count
    return r_tries[len(query)].search(modified_query[::-1])
정확성  테스트
테스트 1 〉	통과 (1.15ms, 10.5MB)
테스트 2 〉	통과 (0.25ms, 10.2MB)
테스트 3 〉	통과 (0.43ms, 10.3MB)
테스트 4 〉	통과 (0.40ms, 10.2MB)
테스트 5 〉	통과 (0.27ms, 10.3MB)
테스트 6 〉	통과 (0.46ms, 10.3MB)
테스트 7 〉	통과 (12.00ms, 12.6MB)
테스트 8 〉	통과 (5.23ms, 10.9MB)
테스트 9 〉	통과 (6.59ms, 12.6MB)
테스트 10 〉	통과 (8.23ms, 12.8MB)
테스트 11 〉	통과 (4.71ms, 10.9MB)
테스트 12 〉	통과 (6.87ms, 12.6MB)
테스트 13 〉	통과 (45.06ms, 22MB)
테스트 14 〉	통과 (26.86ms, 15.3MB)
테스트 15 〉	통과 (59.42ms, 21.4MB)
테스트 16 〉	통과 (43.93ms, 22.4MB)
테스트 17 〉	통과 (14.69ms, 14.9MB)
테스트 18 〉	통과 (36.08ms, 21.2MB)
효율성  테스트
테스트 1 〉	통과 (1253.92ms, 201MB)
테스트 2 〉	통과 (2919.92ms, 378MB)
테스트 3 〉	통과 (2742.66ms, 357MB)
테스트 4 〉	통과 (2479.01ms, 418MB)
테스트 5 〉	통과 (5375.92ms, 786MB)
반응형