[LeetCode] 208. Implement Trie (Prefix Tree) (Python)
- Trie μ΄κΈ°ν:
def __init__(self):
self.root = {}
Trie ν΄λμ€λ μμ±μ __init__
λ₯Ό μ¬μ©νμ¬ Trieμ λ£¨νΈ λ
Έλλ₯Ό μ΄κΈ°νν©λλ€. μ΄ λ£¨νΈ λ
Έλλ λΉ λμ
λλ¦¬λ‘ ννλ©λλ€. μ΄ λμ
λ리μ κ° ν€λ λ¬Έμλ₯Ό λνλ΄λ©°, μ°κ΄λ κ°μ νμ¬ λ
Έλμ μμ λ
Έλλ€μ λνλ΄λ λ λ€λ₯Έ λμ
λ리μ
λλ€.
- λ¨μ΄λ₯Ό 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)μ μΆκ°νμ¬ νμ¬ λ Έλκ° λ¨μ΄μ λμ λνλ΄λ κ²μ νμν©λλ€.
- μ°μ μ½μ
κ³Όμ μ μμνκΈ° μν΄
- 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
λ₯Ό λ°νν©λλ€.
- μ£Όμ΄μ§ μ λμ¬λ‘ μμνλ λ¨μ΄κ° 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)
Leave a comment