Skip to content

Commit 049010f

Browse files
committed
implement trie solution
1 parent 7ce4ff6 commit 049010f

File tree

1 file changed

+79
-0
lines changed

1 file changed

+79
-0
lines changed
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
class Trie {
2+
private let root: TrieNode
3+
4+
init() {
5+
self.root = TrieNode()
6+
}
7+
8+
func insert(_ word: String) {
9+
var node = root // 루트 λ…Έλ“œμ˜ 포인터λ₯Ό κ°€μ Έμ˜€κ³ 
10+
11+
// λ‹¨μ–΄μ˜ 각 κΈ€μžλ₯Ό μˆœνšŒν•˜λ©°, 이미 μžˆλ‹€λ©΄ ν•΄λ‹Ή λ…Έλ“œλ‘œ μ΄λ™ν•˜κ³ ,
12+
// κ·Έλ ‡μ§€ μ•Šλ‹€λ©΄ μƒˆλ‘œμš΄ λ…Έλ“œλ₯Ό μƒμ„±ν•˜μ—¬ μ—°κ²°
13+
for letter in word {
14+
if let childNode = node.children[letter] {
15+
node = childNode
16+
} else {
17+
let newNode = TrieNode()
18+
node.children[letter] = newNode
19+
node = newNode
20+
}
21+
}
22+
23+
// λ‹¨μ–΄μ˜ λ§ˆμ§€λ§‰ κΈ€μž λ…Έλ“œμ— isTerminating을 true둜 μ„€μ •
24+
node.isTerminating = true
25+
}
26+
27+
func search(_ word: String) -> Bool {
28+
var node = root
29+
30+
// λ…Έλ“œ ν¬μΈν„°λ§Œ μ œκ³΅ν•˜μ—¬ 순회 λ‘œμ§μ„ μˆ˜ν–‰ν•˜κ³ ,
31+
// λ§ˆμ§€λ§‰ λ…Έλ“œκ°€ isTerminating이 true인지 확인
32+
guard traverse(startsWith: &node, quote: word) else { return false }
33+
guard node.isTerminating else { return false }
34+
35+
return true
36+
}
37+
38+
func startsWith(_ prefix: String) -> Bool {
39+
var node = root
40+
// λ…Έλ“œ ν¬μΈν„°λ§Œ μ œκ³΅ν•˜μ—¬ 순회 λ‘œμ§μ„ μˆ˜ν–‰ν•˜κ³  κ·ΈλŒ€λ‘œ λ°˜ν™˜
41+
return traverse(startsWith: &node, quote: prefix)
42+
}
43+
44+
// 트리 탐색 둜직
45+
// λ…Έλ“œ 포인터λ₯Ό λ°›μ•„μ„œ, 순회 λ‘œμ§μ„ μˆ˜ν–‰ν•˜κ³  포인터λ₯Ό ꡐ체
46+
private func traverse(startsWith node: inout TrieNode, quote: String) -> Bool {
47+
for letter in quote {
48+
guard let childNode = node.children[letter] else {
49+
return false
50+
}
51+
52+
node = childNode
53+
}
54+
55+
return true
56+
}
57+
}
58+
59+
// 트라이의 각각의 λ…Έλ“œ κ΅¬ν˜„
60+
// μžμ‹ λ…Έλ“œ λ”•μ…”λ„ˆλ¦¬μ™€, 이 κΈ€μžλ‘œ λλ‚˜λŠ” 단어가 μžˆλŠ”μ§€ μ—¬λΆ€λ₯Ό μ €μž₯
61+
// κΈ€μž μžμ²΄λŠ” λΆ€λͺ¨ λ…Έλ“œ λ”•μ…”λ„ˆλ¦¬μ˜ ν‚€λ‘œ μ €μž₯λ˜λ―€λ‘œ λ”°λ‘œ μ €μž₯ν•˜μ§€ μ•ŠμŒ
62+
// λ£¨νŠΈμ—λŠ” 아무 κΈ€μžλ„ λ“€μ–΄κ°€μ§€ μ•ŠλŠ”λ‹€λŠ” Trie의 쑰건도 μžλ™μœΌλ‘œ 만쑱
63+
class TrieNode {
64+
var children: [Character: TrieNode]
65+
var isTerminating: Bool
66+
67+
init(children: [Character: TrieNode] = [:], isTerminating: Bool = false) {
68+
self.children = children
69+
self.isTerminating = isTerminating
70+
}
71+
}
72+
73+
/**
74+
* Your Trie object will be instantiated and called as such:
75+
* let obj = Trie()
76+
* obj.insert(word)
77+
* let ret_2: Bool = obj.search(word)
78+
* let ret_3: Bool = obj.startsWith(prefix)
79+
*/

0 commit comments

Comments
Β (0)