robert-min / dev-blog

김민준 - project 정리한 repo입니다.
0 stars 0 forks source link

231112 - Trie 알고리즘(문자열), 투포인터 활용 #101

Open robert-min opened 1 year ago

robert-min commented 1 year ago

Trie 기본 구현

Trie Node

class TrieNode:
    def __init__(self, key, data=None):
        self.key = key  # 값으로 입력될 분자
        self.data = data    # 문자열의 종료를 알리는 flag
        self.children = defaultdict(TrieNode)   # 자식 노드를 저장

Trie 구현

robert-min commented 1 year ago

트라이 활용

from collections import defaultdict
import sys
sys.setrecursionlimit(10**9)

class TrieNode:
    def __init__(self, key, data=None):
        self.key = key  # 값으로 입력될 분자
        self.data = data    # 문자열의 종료를 알리는 flag
        self.children = defaultdict(TrieNode)   # 자식 노드를 저장
        self.n = 0  # 해당 노드가 방문한 횟수

    # 해당 노드를 방문한 횟수 n 저장
    def finalize(self):
        self.n = 1 if self.data else 0
        for char, node in self.children.items():
            self.n += node.finalize()
        return self.n

class Trie:
    def __init__(self):
        self.root = TrieNode(None)

    def insert(self, word):
        cur_node = self.root
        for char in word:
            if char not in cur_node.children:
                cur_node.children[char] = TrieNode(char)
            cur_node = cur_node.children[char]
        cur_node.data = word

    # 해당 노드를 방문한 횟수 n 저장
    def finalize(self):
        self.root.finalize()

    def search(self, word):
        depth = 0
        cur_node = self.root

        # 문자 하나씩 확인
        for char in word:
            if char in cur_node.children:
                cur_node = cur_node.children[char]
                depth += 1

                # 한번만 방문했다는 뜻은 해당 문자는 다른 문자에는 없는 단어로 찾으려는 값
                if cur_node.n == 1:
                    break

        return depth

def solution(words):
    """
    Return : 몇 개의 문자를 입력하면 되는지
    Params : words
    """
    answer = 0

    trie = Trie()

    for w in words:
        trie.insert(w)

    # 트라이 노드의 방문 횟수 저장
    trie.finalize()

    for w in words:
        answer += trie.search(w)

    return answer
robert-min commented 1 year ago

쿠키구입 - 투포인터 문제

시간초과 풀이

def solution(cookie):
    """
    Return : 한 명의 아들에게 줄 수 있는 가장 많은 과자 수, 없으면 0
    - i ~ m = m+1, r 

    """
    answer = 0
    N = len(cookie)
    for left in range(N-1):
        right = left + 1

        # left
        sum_l = sum(cookie[:left+1])
        L_list = [sum_l]
        for i in range(left):
            sum_l -= cookie[i]
            L_list.append(sum_l)

        # right
        sum_r = sum(cookie[right:N])
        R_list = [sum_r]
        for j in range(N-1, right, -1):
            sum_r -= cookie[j]
            R_list.append(sum_r)

        if len(L_list) < len(R_list):
            for l in L_list:
                if l in R_list:
                    answer = max(answer, l)
        else:
            for r in R_list:
                if r in L_list:
                    answer = max(answer, r)

    return answer