|
| 1 | +''' |
| 2 | +์ด ๋ฌธ์ ๋ ๋ฌธ์์ด์ ํจ์จ์ ์ผ๋ก ์ ์ฅํ๊ณ ๊ฒ์ํ๋ ํธ๋ฆฌ ๊ตฌ์กฐ์ (์ : ์๋์์ฑ ๊ธฐ๋ฅ) |
| 3 | +์ฃผ์ ๊ธฐ๋ฅ : ๋จ์ด ์ถ๊ฐ(insert), ๋จ์ด ๊ฒ์(search), ์ ๋์ฌ ํ์ธ(startsWith) |
| 4 | +
|
| 5 | +Example 1.์ ๋จ๊ณ๋ณ ๋์ |
| 6 | +
|
| 7 | +๋ฉ์๋ ํธ์ถ ์์ ๋ฆฌ์คํธ ์ธ์ ๋ฆฌ์คํธ ์ค์ ํธ์ถ ์์ |
| 8 | +"Trie" [] Trie() -> ๋น ํธ๋ผ์ด๋ฅผ ๋ง๋ฌ. ๋ฃจํธ ๋
ธ๋๊ฐ ์์ฑ๋๊ณ , ์๋ฌด ๋ฌธ์๋ ์ ์ฅ๋์ด ์์ง ์์ |
| 9 | +"insert" ["apple"] insert("apple") -> 'a' ๋
ธ๋๊ฐ ์์ผ๋ฉด ์๋ก ๋ง๋ค๊ณ ์ด๋ |
| 10 | + -> 'p' ๋
ธ๋๊ฐ ์์ผ๋ฉด ์๋ก ๋ง๋ค๊ณ ์ด๋ |
| 11 | + -> ๋ 'p' ๋
ธ๋๊ฐ ์์ผ๋ฉด ์๋ก ๋ง๋ค๊ณ ์ด๋ |
| 12 | + -> 'l' ๋
ธ๋๊ฐ ์์ผ๋ฉด ์๋ก ๋ง๋ค๊ณ ์ด๋ |
| 13 | + -> 'e' ๋
ธ๋๊ฐ ์์ผ๋ฉด ์๋ก ๋ง๋ค๊ณ ์ด๋ |
| 14 | + -> ๋ง์ง๋ง 'e' ๋
ธ๋์ is_end = True ํ์ (์ฌ๊ธฐ๊น์ง๊ฐ "apple"์ด๋ผ๋ ๋จ์ด์์ ๋ปํจ) |
| 15 | +
|
| 16 | +"search" ["apple"] search("apple") -> ๋ฃจํธ๋ถํฐ 'a' โ 'p' โ 'p' โ 'l' โ 'e' ๋
ธ๋๊น์ง ์ฐจ๋ก๋ก ์ด๋ |
| 17 | + -> ๋ง์ง๋ง 'e' ๋
ธ๋๊ฐ is_end = True ์ด๋ฏ๋ก True ๋ฐํ |
| 18 | +
|
| 19 | +"search" ["app"] search("app") -> ๋ฃจํธ๋ถํฐ 'a' โ 'p' โ 'p' ๋
ธ๋๊น์ง ์ด๋ |
| 20 | + -> 'p' ๋
ธ๋์ is_end ๊ฐ์ด False (์์ง "app"์ด๋ผ๋ ๋จ์ด๊ฐ ์์ฑ๋์ง ์์์) |
| 21 | + -> ๋ฐ๋ผ์ False ๋ฐํ |
| 22 | +"startsWith" ["app"] startsWith("app") -> ๋ฃจํธ๋ถํฐ 'a' โ 'p' โ 'p' ๋
ธ๋๊น์ง ์ด๋ |
| 23 | + -> ๋
ธ๋๊ฐ ์กด์ฌํ๋ฏ๋ก True ๋ฐํ (์ ๋์ฌ๋ ์กด์ฌํจ) |
| 24 | +
|
| 25 | +"insert" ["app"] insert("app") -> ๋ฃจํธ๋ถํฐ 'a' โ 'p' โ 'p' ๋
ธ๋๊น์ง ์ด๋ฏธ ์กด์ฌํ๋ฏ๋ก ์ ๋
ธ๋ ์์ฑ ์ ํจ |
| 26 | + -> ๋ง์ง๋ง 'p' ๋
ธ๋์ is_end = True ํ์ (์ด์ "app"๋ ์์ฑ๋ ๋จ์ด์) |
| 27 | + -> "app"์ ์ฒ์์ is_end=False์๊ธฐ ๋๋ฌธ์ ๊ฒ์ ์ False๊ฐ ๋์๊ณ , ์ฝ์
ํ True๊ฐ ๋จ |
| 28 | +
|
| 29 | +"search" ["app"] search("app") -> ๋ฃจํธ๋ถํฐ 'a' โ 'p' โ 'p' ๋
ธ๋๊น์ง ์ด๋ |
| 30 | + -> ๋ง์ง๋ง 'p' ๋
ธ๋๊ฐ is_end = True ์ด๋ฏ๋ก True ๋ฐํ |
| 31 | +
|
| 32 | +<ํธ๋ผ์ด ๊ตฌ์กฐ> |
| 33 | +
|
| 34 | +๋ฃจํธ |
| 35 | + โโ 'a' |
| 36 | + โโ 'p' |
| 37 | + โโ 'p' (is_end=True) โ "app" |
| 38 | + โโ 'l' |
| 39 | + โโ 'e' (is_end=True) โ "apple" |
| 40 | +
|
| 41 | +
|
| 42 | +''' |
| 43 | + |
| 44 | +class TrieNode: # ํธ๋ผ์ด์ ๊ฐ ๋
ธ๋๋ฅผ ํํํ๋ ํด๋์ค |
| 45 | + def __init__(self): |
| 46 | + self.children = {} # ํ์ฌ ๋
ธ๋์ ์์๋ค์ {๋ฌธ์:๋
ธ๋} ํํ๋ก ์ ์ฅ |
| 47 | + self.is_end = False # ํ์ฌ ๋
ธ๋๊ฐ ๋จ์ด์ ๋์ธ์ง ํ์(๊ธฐ๋ณธ๊ฐ False) |
| 48 | + |
| 49 | +class Trie: |
| 50 | + def __init__(self): |
| 51 | + self.root = TrieNode() # ํธ๋ผ์ด์ ์์์ ์ธ ๋น ๋ฃจํธ ๋
ธ๋ ์์ฑ |
| 52 | + |
| 53 | + def insert(self, word: str) -> None: |
| 54 | + node = self.root # ๋ฃจํธ ๋
ธ๋์์ ์์ |
| 55 | + for char in word: # ๋จ์ด์ ๊ฐ ๋ฌธ์๋ฅผ ํ๋์ฉ ์ฒ๋ฆฌ |
| 56 | + if char not in node.children: # ํ์ฌ ๋
ธ๋์ ์์์ ๋ฌธ์๊ฐ ์์ผ๋ฉด |
| 57 | + node.children[char] = TrieNode() # ์๋ก์ด ๋
ธ๋ ์์ฑ ํ ์์์ ์ถ๊ฐ |
| 58 | + node = node.children[char] # ๋ค์ ๋ฌธ์ ๋
ธ๋๋ก ์ด๋ |
| 59 | + node.is_end = True # ๋จ์ด์ ๋ง์ง๋ง ๋ฌธ์ ๋
ธ๋์ ๋ ํ์ |
| 60 | + |
| 61 | + def search(self, word: str) -> bool: |
| 62 | + node = self.root |
| 63 | + for char in word: # ๋จ์ด์ ๊ฐ ๋ฌธ์๋ฅผ ๋ฐ๋ผ ์ด๋ |
| 64 | + if char not in node.children: # ๋ฌธ์๊ฐ ์์ผ๋ฉด ๋จ์ด ์กด์ฌ X -> False |
| 65 | + return False |
| 66 | + node = node.children[char] |
| 67 | + return node.is_end # ๋ชจ๋ ๋ฌธ์๋ฅผ ํต๊ณผํ๋ค๋ฉด, ๋ง์ง๋ง ๋
ธ๋๊ฐ ๋จ์ด ๋์ธ์ง ํ์ธ |
| 68 | + |
| 69 | + |
| 70 | + def startsWith(self, prefix: str) -> bool: |
| 71 | + node = self.root |
| 72 | + for char in prefix: # ์ ๋์ฌ์ ๊ฐ ๋ฌธ์๋ฅผ ๋ฐ๋ผ ์ด๋ |
| 73 | + if char not in node.children: # ๋ฌธ์ ์์ผ๋ฉด ์ ๋์ฌ ์กด์ฌ X -> False |
| 74 | + return False # ๋ชจ๋ ๋ฌธ์๊ฐ ์กด์ฌ -> ์ ๋์ฌ O |
| 75 | + node = node.children[char] |
| 76 | + return True # 7. ์ ๋์ฌ ์กด์ฌ |
| 77 | + |
| 78 | + |
0 commit comments