Skip to content

Commit f819319

Browse files
committed
feat: 문제풀이 추가
1 parent e02f0d2 commit f819319

File tree

1 file changed

+68
-0
lines changed

1 file changed

+68
-0
lines changed
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
// 시간복잡도
2+
// addWord: O(n) (n은 추가하는 단어의 길이)
3+
// search: O(m^n) (m은 각 노드의 최대 자식 수, n은 검색하는 단어의 길이)
4+
5+
// 공간복잡도
6+
// addWord: O(n) (n은 추가하는 단어의 길이)
7+
// search: O(n) (n은 검색하는 단어의 길이, 재귀 호출 스택의 깊이)
8+
9+
class TrieNode {
10+
constructor() {
11+
this.children = {}
12+
this.endOfWord = false
13+
}
14+
}
15+
16+
class WordDictionary {
17+
constructor() {
18+
this.root = new TrieNode()
19+
}
20+
addWord(word) {
21+
let curNode = this.root
22+
23+
for (let i = 0 ; i < word.length; i++) {
24+
if (!curNode.children[word[i]]) {
25+
curNode.children[word[i]] = new TrieNode();
26+
}
27+
28+
curNode = curNode.children[word[i]];
29+
}
30+
31+
curNode.endOfWord = true
32+
}
33+
search(word) {
34+
return this.searchInNode(word, this.root);
35+
}
36+
37+
searchInNode(word, node) {
38+
let curNode = node;
39+
40+
for (let i = 0; i < word.length; i++) {
41+
if (word[i] === '.') {
42+
for (let key in curNode.children) {
43+
if (this.searchInNode(word.slice(i + 1), curNode.children[key])) return true
44+
}
45+
return false
46+
}
47+
48+
if (word[i] !== '.') {
49+
if (!curNode.children[word[i]]) return false
50+
curNode = curNode.children[word[i]];
51+
}
52+
}
53+
54+
return curNode.endOfWord
55+
}
56+
}
57+
58+
59+
const wordDictionary = new WordDictionary();
60+
wordDictionary.addWord("bad");
61+
wordDictionary.addWord("dad");
62+
wordDictionary.addWord("mad");
63+
console.log(wordDictionary.search("pad")); // return False
64+
console.log(wordDictionary.search("bad")); // return True
65+
console.log(wordDictionary.search(".ad")); // return True
66+
console.log(wordDictionary.search("b..")); // return True
67+
68+

0 commit comments

Comments
 (0)