Skip to content

Commit e6bd7eb

Browse files
committed
Design Add and Search Words Data Structure Solution
1 parent e6eb0d3 commit e6bd7eb

File tree

1 file changed

+130
-0
lines changed

1 file changed

+130
-0
lines changed
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
/**
2+
* ๋‹จ์–ด๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ ๋งŒ๋“ค๊ธฐ
3+
*
4+
* ํŠธ๋ผ์ด(Trie) ์ž๋ฃŒ๊ตฌ์กฐ: ๋ฌธ์ž์—ด ์ง‘ํ•ฉ์„ ํ‘œํ˜„ํ•˜๋Š” ํŠธ๋ฆฌ ๊ธฐ๋ฐ˜ ์ž๋ฃŒ๊ตฌ์กฐ, (๋ฌธ์ž์—ด ๊ฒ€์ƒ‰์— ํšจ์œจ์ )
5+
- ๊ฐ ๋…ธ๋“œ๋Š” ๋ฌธ์ž ํ•˜๋‚˜๋ฅผ ๋‚˜ํƒ€๋ƒ„
6+
- ๋ฃจํŠธ์—์„œ ํŠน์ • ๋…ธ๋“œ๊นŒ์ง€์˜ ๊ฒฝ๋กœ๋Š” ํ•˜๋‚˜์˜ ๋ฌธ์ž์—ด์„ ๋‚˜ํƒ€๋ƒ„
7+
- ๊ฐ ๋…ธ๋“œ๋Š” ์ž์‹ ๋…ธ๋“œ๋“ค์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋งํฌ(๋ณดํ†ต ํ•ด์‹œ๋งต)๋ฅผ ๊ฐ€์ง
8+
- ๋‹จ์–ด์˜ ๋์„ ํ‘œ์‹œํ•˜๋Š” ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ•„์š”ํ•จ
9+
*
10+
* ๋Œ€๋ถ€๋ถ„์˜ ๊ฒ€์ƒ‰์€ ์™€์ผ๋“œ์นด๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์ผ ํ…Œ๋‹ˆ๊นŒ, ์ด๊ฒƒ๋งŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ณ„๋„ ๋ฉ”์„œ๋“œ๋กœ ๋ฝ‘์Œ(์™€์ผ๋“œ์นด๋“œ ๋ถ„๊ธฐ์ฒ˜๋ฆฌ)
11+
*
12+
* ์‹œ๊ฐ„๋ณต์žก๋„: O(m) (m: ๋‹จ์–ด์˜ ๊ธธ์ด)
13+
* ๊ณต๊ฐ„๋ณต์žก๋„: O(n) (n: ๋‹จ์–ด์˜ ๊ฐœ์ˆ˜)
14+
*/
15+
16+
var WordDictionary = function () {
17+
// ํŠธ๋ผ์ด ๋…ธ๋“œ ํด๋ž˜์Šค ์ •์˜
18+
this.TrieNode = function () {
19+
this.children = {}; // ์ž์‹ ๋…ธ๋“œ๋“ค์„ ์ €์žฅํ•˜๋Š” ํ•ด์‹œ๋งต
20+
this.isEnd = false; // ๋‹จ์–ด์˜ ๋์„ ํ‘œ์‹œํ•˜๋Š” ํ”Œ๋ž˜๊ทธ
21+
};
22+
23+
this.root = new this.TrieNode(); // ๋ฃจํŠธ ๋…ธ๋“œ ์ƒ์„ฑ
24+
};
25+
26+
/**
27+
* ๋‹จ์–ด๋ฅผ ํŠธ๋ผ์ด์— ์ถ”๊ฐ€
28+
* @param {string} word
29+
* @return {void}
30+
*/
31+
WordDictionary.prototype.addWord = function (word) {
32+
let node = this.root;
33+
34+
// ๋‹จ์–ด์˜ ๊ฐ ๋ฌธ์ž๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ํŠธ๋ผ์ด์— ์ถ”๊ฐ€
35+
for (let i = 0; i < word.length; i++) {
36+
const char = word[i];
37+
38+
// ํ˜„์žฌ ๋ฌธ์ž์— ํ•ด๋‹นํ•˜๋Š” ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด ์ƒ์„ฑ
39+
if (!node.children[char]) {
40+
node.children[char] = new this.TrieNode();
41+
}
42+
43+
// ๋‹ค์Œ ๋ ˆ๋ฒจ๋กœ ์ด๋™
44+
node = node.children[char];
45+
}
46+
47+
// ๋‹จ์–ด์˜ ๋ ํ‘œ์‹œ
48+
node.isEnd = true;
49+
};
50+
51+
/**
52+
* ํŠธ๋ผ์ด์—์„œ ๋‹จ์–ด ๊ฒ€์ƒ‰ (์™€์ผ๋“œ์นด๋“œ '.' ์ง€์›)
53+
* @param {string} word
54+
* @return {boolean}
55+
*/
56+
WordDictionary.prototype.search = function (word) {
57+
// ์™€์ผ๋“œ์นด๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ
58+
if (!word.includes('.')) {
59+
return this.searchExact(word);
60+
}
61+
62+
return this.searchWithWildcard(word, 0, this.root);
63+
};
64+
65+
/**
66+
* ์™€์ผ๋“œ์นด๋“œ ์—†์ด ์ •ํ™•ํ•œ ๋‹จ์–ด ๊ฒ€์ƒ‰
67+
* @param {string} word
68+
* @return {boolean}
69+
*/
70+
WordDictionary.prototype.searchExact = function (word) {
71+
let node = this.root;
72+
73+
for (let i = 0; i < word.length; i++) {
74+
const char = word[i];
75+
76+
// ํ•ด๋‹น ๋ฌธ์ž์˜ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด false
77+
if (!node.children[char]) {
78+
return false;
79+
}
80+
81+
node = node.children[char];
82+
}
83+
84+
// ๋‹จ์–ด์˜ ๋์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ isEnd ํ”Œ๋ž˜๊ทธ ํ™•์ธ
85+
return node.isEnd;
86+
};
87+
88+
/**
89+
* ์™€์ผ๋“œ์นด๋“œ๋ฅผ ํฌํ•จํ•œ ๋‹จ์–ด ๊ฒ€์ƒ‰ (์žฌ๊ท€์ )
90+
* @param {string} word - ๊ฒ€์ƒ‰ํ•  ๋‹จ์–ด
91+
* @param {number} index - ํ˜„์žฌ ๊ฒ€์ƒ‰์ค‘์ธ ๋ฌธ์ž ์ธ๋ฑ์Šค
92+
* @param {object} node - ํ˜„์žฌ ๊ฒ€์ƒ‰์ค‘์ธ ๋…ธ๋“œ
93+
* @return {boolean}
94+
*/
95+
WordDictionary.prototype.searchWithWildcard = function (word, index, node) {
96+
// ๋‹จ์–ด์˜ ๋ชจ๋“  ๋ฌธ์ž๋ฅผ ๊ฒ€์‚ฌํ–ˆ์œผ๋ฉด
97+
if (index === word.length) {
98+
return node.isEnd;
99+
}
100+
101+
const char = word[index];
102+
103+
// ์™€์ผ๋“œ์นด๋“œ('.')์ธ ๊ฒฝ์šฐ
104+
if (char === '.') {
105+
// ํ˜„์žฌ ๋…ธ๋“œ์˜ ๋ชจ๋“  ์ž์‹์— ๋Œ€ํ•ด ์žฌ๊ท€์ ์œผ๋กœ ๊ฒ€์ƒ‰
106+
for (const key in node.children) {
107+
if (this.searchWithWildcard(word, index + 1, node.children[key])) {
108+
return true;
109+
}
110+
}
111+
return false;
112+
}
113+
// ์ผ๋ฐ˜ ๋ฌธ์ž์ธ ๊ฒฝ์šฐ
114+
else {
115+
// ํ•ด๋‹น ๋ฌธ์ž์— ๋Œ€ํ•œ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด false
116+
if (!node.children[char]) {
117+
return false;
118+
}
119+
120+
// ๋‹ค์Œ ๋ฌธ์ž ๊ฒ€์ƒ‰
121+
return this.searchWithWildcard(word, index + 1, node.children[char]);
122+
}
123+
};
124+
125+
/**
126+
* Your WordDictionary object will be instantiated and called as such:
127+
* var obj = new WordDictionary()
128+
* obj.addWord(word)
129+
* var param_2 = obj.search(word)
130+
*/

0 commit comments

Comments
ย (0)