Published:
Updated:

  1. Trie μ΄ˆκΈ°ν™”:
def __init__(self):
    self.root = {}

Trie ν΄λž˜μŠ€λŠ” μƒμ„±μž __init__λ₯Ό μ‚¬μš©ν•˜μ—¬ Trie의 루트 λ…Έλ“œλ₯Ό μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€. 이 루트 λ…Έλ“œλŠ” 빈 λ”•μ…”λ„ˆλ¦¬λ‘œ ν‘œν˜„λ©λ‹ˆλ‹€. 이 λ”•μ…”λ„ˆλ¦¬μ˜ 각 ν‚€λŠ” 문자λ₯Ό λ‚˜νƒ€λ‚΄λ©°, μ—°κ΄€λœ 값은 ν˜„μž¬ λ…Έλ“œμ˜ μžμ‹ λ…Έλ“œλ“€μ„ λ‚˜νƒ€λ‚΄λŠ” 또 λ‹€λ₯Έ λ”•μ…”λ„ˆλ¦¬μž…λ‹ˆλ‹€.


  1. 단어λ₯Ό Trie에 μ‚½μž…:
def insert(self, word: str) -> None:
    current_node = self.root

    while word:
        if word[0] not in current_node:
            current_node[word[0]] = {}

        current_node = current_node[word[0]]
        word = word[1:]

    current_node[0] = {}
  • insert λ©”μ„œλ“œλŠ” 단어λ₯Ό Trie에 μ‚½μž…ν•˜λŠ” κΈ°λŠ₯을 ν•©λ‹ˆλ‹€. wordλΌλŠ” λ¬Έμžμ—΄μ„ μž…λ ₯λ°›κ³ , λ°˜ν™˜κ°’μ€ μ—†μŠ΅λ‹ˆλ‹€ (None).
    • μš°μ„  μ‚½μž… 과정을 μ‹œμž‘ν•˜κΈ° μœ„ν•΄ current_nodeλ₯Ό Trie의 루트둜 μ„€μ •ν•©λ‹ˆλ‹€.
    • word의 각 문자λ₯Ό ν•˜λ‚˜μ”© λ°˜λ³΅ν•˜λ©΄μ„œ μ²˜λ¦¬ν•©λ‹ˆλ‹€.
    • λ§Œμ•½ ν˜„μž¬ 문자 (즉, word[0])κ°€ current_node λ”•μ…”λ„ˆλ¦¬μ˜ ν‚€λ‘œ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄, ν•΄λ‹Ή 문자λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μžμ‹ λ…Έλ“œλ₯Ό μƒˆλ‘œ λ§Œλ“€μ–΄μ€˜μ•Ό ν•©λ‹ˆλ‹€. λ”°λΌμ„œ μƒˆλ‘œμš΄ λ”•μ…”λ„ˆλ¦¬λ₯Ό μƒμ„±ν•˜κ³  current_node[word[0]]에 ν• λ‹Ήν•©λ‹ˆλ‹€.
    • κ·Έ λ‹€μŒ, current_nodeλ₯Ό μƒˆλ‘œ μƒμ„±ν•œ μžμ‹ λ…Έλ“œλ‘œ μ΄λ™μ‹œμΌœμ€λ‹ˆλ‹€. 즉, current_node = current_node[word[0]]으둜 μ„€μ •ν•©λ‹ˆλ‹€.
    • μ΄λŸ¬ν•œ 과정을 word의 λͺ¨λ“  문자λ₯Ό μ²˜λ¦¬ν•  λ•ŒκΉŒμ§€ λ°˜λ³΅ν•©λ‹ˆλ‹€.
    • λ§ˆμ§€λ§‰μœΌλ‘œ, λͺ¨λ“  문자 μ²˜λ¦¬κ°€ λλ‚œ ν›„ νŠΉλ³„ν•œ ν‘œμ‹œ (μ—¬κΈ°μ„œλŠ” 0)을 μΆ”κ°€ν•˜μ—¬ ν˜„μž¬ λ…Έλ“œκ°€ λ‹¨μ–΄μ˜ 끝을 λ‚˜νƒ€λ‚΄λŠ” 것을 ν‘œμ‹œν•©λ‹ˆλ‹€.


  1. Trieμ—μ„œ 단어 검색:
def search(self, word: str) -> bool:
    current_node = self.root

    while word:
        if word[0] not in current_node:
            return False

        current_node = current_node[word[0]]
        word = word[1:]

    if 0 in current_node:
        return True

    return False

search λ©”μ„œλ“œλŠ” 주어진 wordκ°€ Trie에 μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€. λ§Œμ•½ 단어가 μ‘΄μž¬ν•œλ‹€λ©΄ Trueλ₯Ό λ°˜ν™˜ν•˜κ³ , 그렇지 μ•Šλ‹€λ©΄ Falseλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

  • 검색 과정을 μ‹œμž‘ν•˜κΈ° μœ„ν•΄ current_nodeλ₯Ό Trie의 루트둜 μ„€μ •ν•©λ‹ˆλ‹€.
  • word의 각 문자λ₯Ό ν•˜λ‚˜μ”© λ°˜λ³΅ν•˜λ©΄μ„œ μ²˜λ¦¬ν•©λ‹ˆλ‹€.
  • λ§Œμ•½ ν˜„μž¬ 문자 (즉, word[0])κ°€ current_node λ”•μ…”λ„ˆλ¦¬μ˜ ν‚€λ‘œ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄, ν•΄λ‹Ή 단어가 Trie에 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” κ²ƒμ΄λ―€λ‘œ Falseλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • 그렇지 μ•Šλ‹€λ©΄, current_nodeλ₯Ό ν˜„μž¬ λ¬Έμžμ— ν•΄λ‹Ήν•˜λŠ” μžμ‹ λ…Έλ“œλ‘œ μ΄λ™μ‹œν‚΅λ‹ˆλ‹€.
  • μ΄λŸ¬ν•œ 과정을 word의 λͺ¨λ“  문자λ₯Ό μ²˜λ¦¬ν•  λ•ŒκΉŒμ§€ λ°˜λ³΅ν•©λ‹ˆλ‹€.
  • λͺ¨λ“  문자 μ²˜λ¦¬κ°€ λλ‚œ ν›„μ—λŠ” current_node에 νŠΉλ³„ν•œ ν‘œμ‹œ (μ—¬κΈ°μ„œλŠ” 0)κ°€ μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€. λ§Œμ•½ νŠΉλ³„ν•œ ν‘œμ‹œκ°€ μ‘΄μž¬ν•œλ‹€λ©΄, μ΄λŠ” 단어가 Trie에 μ‘΄μž¬ν•˜λŠ” 것을 μ˜λ―Έν•˜λ―€λ‘œ Trueλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. 그렇지 μ•Šλ‹€λ©΄, 단어가 Trie에 μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ Falseλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.


  1. 주어진 μ ‘λ‘μ‚¬λ‘œ μ‹œμž‘ν•˜λŠ” 단어가 Trie에 μ‘΄μž¬ν•˜λŠ”μ§€ 확인:
def startsWith(self, prefix: str) -> bool:
    current_node = self.root

    while prefix:
        if prefix[0] not in current_node:
            return False

        current_node = current_node[prefix[0]]
        prefix = prefix[1:]

    return True

startsWith λ©”μ„œλ“œλŠ” Trie에 주어진 μ ‘λ‘μ‚¬λ‘œ μ‹œμž‘ν•˜λŠ” 단어가 μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€. λ§Œμ•½ κ·ΈλŸ¬ν•œ 단어가 μ‘΄μž¬ν•œλ‹€λ©΄ Trueλ₯Ό λ°˜ν™˜ν•˜κ³ , 그렇지 μ•Šλ‹€λ©΄ Falseλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

  • μ ‘λ‘μ‚¬λ‘œ μ‹œμž‘ν•˜λŠ” 단어λ₯Ό μ°ΎκΈ° μœ„ν•΄ current_nodeλ₯Ό Trie의 루트둜 μ„€μ •ν•©λ‹ˆλ‹€.
  • prefix의 각 문자λ₯Ό ν•˜λ‚˜μ”© λ°˜λ³΅ν•˜λ©΄μ„œ μ²˜λ¦¬ν•©λ‹ˆλ‹€.
  • λ§Œμ•½ ν˜„μž¬ 문자 (즉, prefix[0])κ°€ current_node λ”•μ…”λ„ˆλ¦¬μ˜ ν‚€λ‘œ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄, ν•΄λ‹Ή μ ‘λ‘μ‚¬λ‘œ μ‹œμž‘ν•˜λŠ” 단어가 Trie에 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” κ²ƒμ΄λ―€λ‘œ Falseλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • 그렇지 μ•Šλ‹€λ©΄, current_nodeλ₯Ό ν˜„μž¬ λ¬Έμžμ— ν•΄λ‹Ήν•˜λŠ” μžμ‹ λ…Έλ“œλ‘œ μ΄λ™μ‹œν‚΅λ‹ˆλ‹€.
  • μ΄λŸ¬ν•œ 과정을 prefix의 λͺ¨λ“  문자λ₯Ό μ²˜λ¦¬ν•  λ•ŒκΉŒμ§€ λ°˜λ³΅ν•©λ‹ˆλ‹€.
  • λ§Œμ•½ 반볡문이 Falseλ₯Ό λ°˜ν™˜ν•˜μ§€ μ•Šκ³  λλ‚œλ‹€λ©΄, 주어진 μ ‘λ‘μ‚¬λ‘œ μ‹œμž‘ν•˜λŠ” 단어가 Trie에 적어도 ν•˜λ‚˜ 이상 μ‘΄μž¬ν•œλ‹€λŠ” λœ»μ΄λ―€λ‘œ Trueλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.


Solution

class Trie:

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

    # 1. 낱말을 κΈ€μžλ‘œ μͺΌκ°  ν›„ λ…Έλ“œμ— κ³΅ν†΅λ˜λŠ” κΈ€μžκ°€ 있으면 κ·Έ κΈ€μž λ…Έλ“œλ‘œ 진행
    # 2. 낱말을 κΈ€μžλ‘œ μͺΌκΊ€ ν›„ λ…Έλ“œμ— κ·Έ κΈ€μžκ°€ μ—†λ‹€λ©΄, κΈ€μžμ— ν•΄λ‹Ήλ˜λŠ” λ…Έλ“œλ₯Ό λ§Œλ“€κ³  진행
    def insert(self, word: str) -> None:
        current_node = self.root

        while word:
            if word[0] not in current_node:
                current_node[word[0]] = {}

            current_node = current_node[word[0]]
            word = word[1:]

        current_node[0] = {}

    def search(self, word: str) -> bool:
        current_node = self.root

        while word:
            if word[0] not in current_node:
                return False

            current_node = current_node[word[0]]
            word = word[1:]

        if 0 in current_node:
            return True

        return False

    def startsWith(self, prefix: str) -> bool:
        current_node = self.root

        while prefix:
            if prefix[0] not in current_node:
                return False

            current_node = current_node[prefix[0]]
            prefix = prefix[1:]

        return True

# Your Trie object will be instantiated and called as such:
# obj = Trie()
# obj.insert(word)
# param_2 = obj.search(word)
# param_3 = obj.startsWith(prefix)


Reference

Leave a comment