|
| 1 | +# 7๊ธฐ ํ์ด |
| 2 | +# Trie ์ ์ฒด ๊ณต๊ฐ ๋ณต์ก๋: ๊ณต๊ฐ: O(n * m) |
| 3 | +# - n์ ๋จ์ด ์, m์ ํ๊ท ๋จ์ด ๊ธธ์ด |
| 4 | +# ๊ฐ ๋ฉ์๋ ๋ง๋ค ์๊ฐ ๋ณต์ก๋์ ๊ณต๊ฐ ๋ณต์ก๋ ์์ฑ |
| 5 | +class Node: |
| 6 | + def __init__(self, val=None): |
| 7 | + self.children = {} # ์์ ๋
ธ๋๋ฅผ ๋ด์ dictionary |
| 8 | + self.is_end = False # ํ์ฌ ๋
ธ๋๋ฅผ ๋์ผ๋ก ํ๋ ๋จ์ด๊ฐ ์ ์ฅ๋์๋์ง์ ๋ํ flag |
| 9 | + |
| 10 | + |
| 11 | +class Trie: |
| 12 | + def __init__(self): |
| 13 | + self.root = Node() |
| 14 | + |
| 15 | + def insert(self, word: str) -> None: |
| 16 | + # ์๊ฐ: O(m) โ m์ word์ ๊ธธ์ด, ๋ฌธ์ ํ๋์ฉ ์ํ |
| 17 | + # ๊ณต๊ฐ: O(m) โ ์ต์
์ ๊ฒฝ์ฐ m๊ฐ์ ์ ๋
ธ๋ ์์ฑ (์๋ฌด๊ฒ๋ ๊ณต์ ์ํ ๋) |
| 18 | + node = self.root |
| 19 | + for s in word: |
| 20 | + if s not in node.children: # ์์ง ์ ์ฅ์ด ๋์ง ์์ ๋ฌธ์๋ผ๋ฉด children์ ๋
ธ๋๋ก์จ ์ ์ฅํด๋๋ค. |
| 21 | + node.children[s] = Node(s) |
| 22 | + node = node.children[s] # ๋ค์ ๋
ธ๋๋ฅผ children node๋ก ์ง์ ํ์ฌ ํ์๊น์ง ์ ์ฅํ ์ ์๋๋ก ํจ |
| 23 | + node.is_end = True # ๋ชจ๋ ๋
ธ๋๋ฅผ ์ ์ฅํ ํ์๋ ๋จ์ด์ ๋์ ์๋ฆฌ๋๋ก is_end๋ฅผ True๋ก ๋ณ๊ฒฝ |
| 24 | + |
| 25 | + def search(self, word: str) -> bool: |
| 26 | + # ์๊ฐ: O(m) โ m์ word/prefix์ ๊ธธ์ด๋งํผ ์ํ |
| 27 | + # ๊ณต๊ฐ: O(1) โ ์ ๋
ธ๋ ์์ฑ ์์ด ํฌ์ธํฐ๋ง ์ด๋ |
| 28 | + node = self.root |
| 29 | + for s in word: |
| 30 | + if s not in node.children: # ์ฐพ์ผ๋ ค๋ ๋จ์ด์ ๋ฌธ์๊ฐ ์ ์ฅ๋์ด ์์ง ์์ผ๋ฉด search ์คํจ์ด๋ฏ๋ก False ๋ฐํ |
| 31 | + return False |
| 32 | + node = node.children[s] |
| 33 | + |
| 34 | + return node.is_end # ๋๊น์ง ๋์๋ณด๊ณ ํด๋น ๋จ์ด์ ๋์ด ์ ์ฅ๋์ด ์๋์ง ์๋์ง๋ฅผ ๋ฐํํ๋ฏ๋ก์จ search์ ์ฑํจ ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์์ |
| 35 | + |
| 36 | + def startsWith(self, prefix: str) -> bool: |
| 37 | + # start with์ ๊ฒฝ์ฐ์๋, search์ ๊ฑฐ์ ๋ก์ง์ด ๋์ผํ๋, is_end์ ์ฌ๋ถ๋ฅผ ๋ณผ ํ์๊ฐ ์์ผ๋ฏ๋ก ๋ชจ๋ ๋ฌธ์์ ๋ํ search๊ฐ ๋๋๋ฉด ๋ฌด์กฐ๊ฑด True ๋ฐํ |
| 38 | + node = self.root |
| 39 | + for s in prefix: |
| 40 | + if s not in node.children: |
| 41 | + return False |
| 42 | + node = node.children[s] |
| 43 | + |
| 44 | + return True |
| 45 | + |
0 commit comments