1. ํธ๋ผ์ด๋?
ํธ๋ผ์ด
๋ ํธ๋ฆฌ์ ์ผ์ข
์ผ๋ก์ ๋๋์ ๋ฌธ์์ด์ ๋น ๋ฅธ ์๊ฐ ์์ ์ฝ์
, ์ญ์ , ์กฐํ ํ๊ธฐ ์ํด ๊ณ ์๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
2. ํธ๋ผ์ด์ ์๋ฆฌ
'์ ๋์ ๋ฌธ์๊ฐ ๊ฐ์ ๋ ์๋ค๋ผ๋ฆฌ ์ต๋ํ ๊ฐ์ ๊ฐ์ง์ ๋ฐ์ด ๋ฃ๋๋ค.'
- 1๏ธโฃ
๋ ธ๋ ํ๋ = ๋ฌธ์ ํ๋
, ์์ง์ ์ผ๋ก ๋ฌธ์์ด์ ๋ฌธ์๋ฅผ ํ๋์ฉ ์ ์ฅํจ - 2๏ธโฃ
A์ ๊ธธ์ด
<B์ ๊ธธ์ด
์ธ๋ฐ, $A\subset{B}$ ์ธ ๊ฒฝ์ฐ, A์ B๋ ์ง๊ณ์กด์ (A = ๋ถ๋ชจ ๋ ธ๋, B = ์์ ๋ ธ๋) - 3๏ธโฃ $A\nsubseteq{B}$ ์ธ๋ฐ, ๋์ด ๊ฐ์ ์ ๋ ๋ฌธ์๋ฅผ ๊ฐ์ง ๋, A์ B๋ ๋ฐฉ๊ณ์ (ํ์ ๊ด๊ณ ์ด๊ฑฐ๋, ์ผ์ด-์กฐ์นด ๊ด๊ณ)
์ด๋ฅผ ๊ธฐ์ด๋ก ํ ํธ๋ผ์ด์ ํ ํํ์ด๋ค. ํด๋น ํธ๋ผ์ด์ ๋ฃ์ ๋ฌธ์์ด์ ๋ค์๊ณผ ๊ฐ๋ค.["frodo", "front", "frost", "frozen", "frame", "bus", "busy"]
3. ํธ๋ผ์ด์ ๊ตฌ์กฐ
- 1๏ธโฃ ROOT ๋ ธ๋๋ ํญ์ ๋น์ด์๋ค. (ROOT ๋ ธ๋๋ ์์์ , ROOT์ ์์๋ค์ด ์ด๋ค ๋จ์ด์ ์์์ ์ด๋ค.)
- 2๏ธโฃ ํ๋์ ๋ ธ๋๋ ๋ค์ ๋ฌธ์ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ Map๊ณผ ํ ๋ ธ๋๊ฐ ๋ฌธ์์ด์ ๋์ธ์ง๋ฅผ ๋ํ๋ด๋ boolean ๊ฐ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
class Node {
HashMap<Character, Node> children;
boolean isEnd;
}
์ฌ๊ธฐ์ ๊ฐ๊ฐ์ children
๊ณผ isEnd
๋ผ๊ณ ํ๊ฒ ๋ค.children
์ Key๋ ๋ค์ ๋ฌธ์ (์์ ๋
ธ๋)์ ์ด๋ฆ์ด๊ณ , Value๋ ๊ทธ๊ฒ์ ๊ฐ์ฒด ์ฃผ์๋ฅผ ๋ํ๋ธ๋ค. ์๋ฅผ ๋ค์ด, ์์ ํธ๋ฆฌ์์ ํ์ฌ ๋ณด๊ณ ์๋ ๋
ธ๋๊ฐ fro์์ o
์ผ ๋ children์ ๊ตฌ์ฑ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
[<d, #fdfd31>, <n, #dfd123>, <s, #dfkp30>, <z, #dpfskd>]
isEnd
๋ ์ ํ์ํ ๊น? ๊ทธ ์ด์ ๋, ์์ bus์ busy ์ฒ๋ผ ํ๋์ ๋จ์ด ์ ์ฒด๊ฐ ๋ค๋ฅธ ๋จ์ด์ ์ ๋๊ฐ ๋๋ ๊ฒฝ์ฐ๊ฐ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ bus์ s์ isEnd ํ์๋ฅผ ํด๋์ด์ bus ๋ผ๋ ๋จ์ด๊ฐ ํธ๋ผ์ด์ ์ ์ฅ๋ ์ํ์์ ํ์ํด๋์ด์ผ ํ๋ค. ์ ๊ทธ๋ฆผ์์ ํ๋์์ผ๋ก ์์น ๋ ๋
ธ๋๊ฐ ๋ฐ๋ก isEnd๊ฐ true์ธ ๋
ธ๋ ๋ค์ด๋ค.
4. ํธ๋ผ์ด์ ๋ณต์ก๋
(1) ์๊ฐ ๋ณต์ก๋
์ฝ์
, ์ญ์ , ์กฐํ ํ๋ ค๋ ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ $L$์ด๋ผ ํ์ ๋,
์ฝ์
, ์ญ์ , ์กฐํ ์๊ฐ ๋ณต์ก๋: $O(L)$
์ด์ : ์์์ ๋ณด์๋ค์ํผ, ํธ๋ผ์ด๋ ๊ฒน์น๋ ๋จ์ด๊ฐ ๋ง์ ๋ฌธ์๋ค์ ์ต๋ํ ๊ฐ์ ๊ฐ์ง์ ๋ฐ์ด๋ฃ๋๋ค. ๋ฐ๋ผ์ ํ๋์ ๋ฌธ์์ด์ ๋ฌด์กฐ๊ฑด ํ๋์ ๊ฒฝ๋ก์๋ง ์กด์ฌํ๋ค. ๋ฐ๋ผ์์กฐํ
์ ์ต์
์ ๊ฒฝ์ฐ, ์ฐพ์ผ๋ ค๋ ๋ฌธ์์ด์ ๋ชจ๋ ๋ฌธ์๋งํผ ํธ๋ฆฌ์ ๋
ธ๋๋ฅผ ์์ง์ผ๋ก ์กฐํ ํ๋ฏ๋ก $O(L)$,์ฝ์
์์๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ชจ๋ ๋ฌธ์๋ฅผ ํธ๋ฆฌ์ ์์ง์ ์ผ๋ก ์ ์ฅํ๋ฏ๋ก $O(L)$์ญ์
์์๋ ๋ฌธ์์ด์ ๋ ๋ถ๋ถ๊น์ง ๋๋ฌํด์ผ ํ๋ฏ๋ก $O(L)$ ์ ์๊ฐ์ด ๋ ๋ค.
(2) ๊ณต๊ฐ ๋ณต์ก๋
ํธ๋ฆฌ์ ๊น์ด๋ฅผ $h$ ๋ผ๊ณ ํ์ ๋, ๊ณต๊ฐ๋ณต์ก๋: $O(26^{h})$
์๊ณ ๋ฆฌ์ฆ์ ํญ์ ์ฐ๊ธ์ ์ฌ์ฒ๋ผ ๋ฑ๊ฐ๊ตํ์ ๋ฒ์น์ด ์ฑ๋ฆฝํ๋ค. ์์ฒ๋ผ ์๊ฐ๋ณต์ก๋๊ฐ ๋น ๋ฅผ ์๋ก, ๊ณต๊ฐ๋ณต์ก๋๋ฅผ ๋ง์ด ์๋ชจํ๋ค. ํธ๋ผ์ด๋ ๋ง์ฐฌ๊ฐ์ง ์ด๋ค.
์ต์
์ ๊ฒฝ์ฐ, ๋ชจ๋ ๋
ธ๋๊ฐ 26๊ฐ์ง ์์ ๋
ธ๋๋ฅผ ๊ฐ์ ธ์ผ ํ๋ค. ๋ฐ๋ผ์ ํธ๋ฆฌ์ ๋์ด๋ฅผ h
๋ผ๊ณ ํ ๋, $O(26^{h})$ ์ ๊ณต๊ฐ ๋ณต์ก๋๊ฐ ๋ ๋ค. ๊ฐ์ฒด ํ๋๊ฐ ํ๊ท 28byte
์ธ ๊ฑธ ๊ฐ์ํ๋ฉด, ๊ฝค ๋ง์ ๊ณต๊ฐ์ด ํ์ํ๋ค. ์๋ฅผ ๋ค์ด h = 5๋ผ๊ณ ํ์. ๊ทธ๋ฌ๋ฉด ์ด 332678528 byte๊ฐ ํ์ํ๊ณ , MB๋ก ํ์ฐํ๋ฉด, 332MB๊ฐ ๋ ๋ค.
5. ํธ๋ผ์ด ๊ตฌํ
์์ฑ์
, ์ฝ์
, ์กฐํ
, ์ญ์
์์ผ๋ก ํ๋์ฉ ๊ตฌํํด๋ณด๊ฒ ๋ค.
(1) ์์ฑ์
ํธ๋ผ์ด์ ๊ตฌ์ฑ์์๊ฐ ๋๋ Node
์ ํธ๋ผ์ด์ ๊ตฌํ์ฒด์ธ Tri
๋ ๊ฐ๋
์ฑ์ ์ํด์ ํด๋์ค๋ฅผ ๋ฐ๋ก ๋ง๋ค๊ฒ ๋ค.
Nodeโจ
class Node {
HashMap<Character, Node> children;
boolean isEnd;
public Node () {
this.children = new HashMap<>();
this.isEnd = false;
}
}
Triโจ
class Tri {
Node root;
public Tri () {
this.root = new Node();
}
}
๋ง์ฝ Tri์ ๊ฐ์ฒด๋ฅผ ํ๋ ์ ์ธํ๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ด ๋ง๋ค์ด์ง ๊ฒ์ด๋ค.
์ด์ Root์ ์๋ก์ด ๋ฌธ์์ด์ด ๋ค์ด์ฌ ๋๋ง๋ค, children์ ์๋ก์ด ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ง ๊ฒ์ด๋ค.
(2) ์ฝ์
์ฝ์ ์ ๋ค์ ์์๋๋ก ์ด๋ฃจ์ด์ง๋ค.
- 1๏ธโฃ Root ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํ์ฌ, ๊ทธ๊ฒ์
children
์ ํ์ธํ๋ค. - 2๏ธโฃ ๋ง์ฝ ํ์ฌ ์ง์ด๋ฃ์ด์ผํ ๋ฌธ์(์ดํ A)๊ฐ children์ ์๋ค๋ฉด, ์๋ฌด ํ๋์ ํ์ง ์๋๋ค.
- 3๏ธโฃ ๋ง์ฝ A๊ฐ children์ ์๋ค๋ฉด, ์๋กญ๊ฒ ๊ฐ์ฒด ์์ฑ ํ, children์ ์ฝ์
ํ๋ค.
<์ฝ์ ํ ๋ฌธ์, ๊ฐ์ฒด>
- 4๏ธโฃ ์ด์ A์ ๊ฐ์ฒด๋ฅผ ๋ฐฉ๋ฌธํ๊ณ , 2๏ธโฃ~3๏ธโฃ์ ๋ฌธ์์ด ์ ๋ถ ํธ๋ผ์ด์ ์ง์ด๋ฃ์ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
- 5๏ธโฃ ๋ฌธ์์ด์ ๋ ๋ฌธ์๋ฅผ ๋
ธ๋์ ์ฝ์
ํ๋ค๋ฉด, ํด๋น ๋
ธ๋์
isEnd
=true
๋ก ๋ฐ๊ฟ์ค๋ค.
์์๋
ธ๋๋ฅผ ๋์์์ด ๋ฐฉ๋ฌธํ๊ธด ํ์ง๋ง, ๋ค์ ์๋ ๋
ธ๋๋ก ๋๋์์์ ํ๋ ๊ณ์ฐ์ด ์๋ ๋จ๋ฐฉํฅ ์์ง์
์ด๋ฏ๋ก, ์ฌ๊ท๊ฐ ์๋ ๋ฐ๋ณต๋ฌธ์ผ๋ก ๊ตฌํํด๋ ๋๋ค. (ํ์๋ ์ด ํธ์ด ๊ฐ๋
์ฑ์ด ๋์ ๊ทธ๋ ๊ฒ ์งํํ๋ค. )
public void insert(String str) {
Node cur = this.root; // ์ด๊ธฐํ
for (int i = 0; i < str.length(); i++) {
char now = str.charAt(i); // ํ์ฌ tri์ ์ฝ์
ํด์ผํ ๋ฌธ์
cur.children.putIfAbsent(now, new Node());
cur = cur.children.get(now);
}
cur.isEnd = true;
}
cur
๋
ธ๋์ ๊ณ์ ์์ ๋
ธ๋๊ฐ ํ ๋น๋๋ฉฐ, ํธ๋ผ์ด๋ฅผ ๊น๊ฒ ํ๊ตฌํ๋ค. ์ฌ๊ธฐ์ ํท๊ฐ๋ฆฌ์ง ๋ง์์ผ ํ ์ ์ด, ํ์ฌ ๋ฃ์ด์ผํ ๋ฌธ์ now
๋ ํ์ฌ ํ์ธ ์ค์ธ Node cur
์ ์์๋
ธ๋๋ค์ ๊ฐ๋ฆฌํค๋ children
์ ์ฝ์
๋๋ค๋ ๊ฒ์ด๋ค. ๊ทธ ์ด์ ๋ ์ฐ๋ฆฌ๊ฐ ์ฒ์์ ๊ฐ์ด ๋น์ด์๋ Root ๋
ธ๋ ๋ถํฐ ์์ํ๊ณ , ๊ทธ๊ฒ์ ์์๋
ธ๋์ ๋ฌธ์์ด์ ์ฒซ ๋ฌธ์๋ฅผ ๋ฃ๋๋ก ์ค๊ณํ๊ธฐ ๋๋ฌธ์ด๋ค.
ex โจ
์ ํธ๋ผ์ด์ "best"
์ฝ์
a. b ๋ฃ์ผ๋ ค ๋ดค๋๋ฐ ์ด๋ฏธ root์ children์ ์กด์ฌํจ, ๊ทธ๋์ cur = ๋ ธ๋ b๋ก ์ด๋๋ง ํ๋ค.
b. e ๋ฃ์ผ๋ ค๊ณ ๋ดค๋๋ฐ, b์ children์๋ ์กด์ฌํ์ง ์๋๋ค. e ์ฝ์
c. e์ children์๋ s๊ฐ ์กด์ฌํ์ง ์๋๋ค. s ๊ฐ์ฒด ์์ฑ ํ ์ฝ์
d. s์ children์๋ t๊ฐ ์กด์ฌํ์ง ์๋๋ค. t ๊ฐ์ฒด ์์ฑ ํ ์ฝ์
e. t๊ฐ ๋ฌธ์์ด์ ๋์์ผ๋ก isEnd
= true
๋ก ๋ฐ๊ฟ์ค๋ค.
(3) ์กฐํ
์กฐํ๋ ์ฝ์ ๊ณผ ๋งค์ปค๋์ฆ์ด ๋น์ทํ๋ค.
- 1๏ธโฃ Root ๋
ธ๋๋ถํฐ ๋ฌธ์์ด์ ๋ฌธ์๋ฅผ ํ๋์ฉ
์กฐํ
ํ๋ค. (์ฌ๊ธฐ์ ์กฐํ๋, ํด๋น Node์ Children์ ํ์ฌ ์กฐํ ์ค์ธ ๋ฌธ์๊ฐ ์กด์ฌํ๋์ง ์ด๋ค.) - 2๏ธโฃ ๋ง์ฝ ์กฐํํด๋, ํ ์กฐํ ์ค์ธ ๋ฌธ์๊ฐ children์์ ๋์ค์ง ์์ผ๋ฉด, ํด๋น ๋ฌธ์์ด์ ํธ๋ผ์ด์ ์ ์ฅ๋์ง ์์๋ค๋ ์๋ฏธ์ด๋ฏ๋ก, ํจ์๋ฅผ ์ข
๋ฃํ๊ณ
false
๋ฅผ ๋ฐํํ๋ค. - 3๏ธโฃ ๋ง์ฝ ๋ฌธ์์ด์ ๋ ๋ฌธ์ ๋
ธ๋๋ฅผ ์กฐํํ๋๋ฐ,
isEnd
=false
๋ผ๋ฉด, ํด๋น ๋ฌธ์์ด์ด ํธ๋ผ์ด์ ์ ์ฅ๋์ง ์์๋ค๋ ์๋ฏธ์ด๋ฏ๋ก, ํจ์๋ฅผ ์ข ๋ฃํ๊ณfalse
๋ฅผ ๋ฐํํ๋ค. - 4๏ธโฃ ์ 2๏ธโฃ, 3๏ธโฃ ์ ํด๋นํ์ง ์๊ณ , ํจ์๋ฅผ ๋ฌด์ฌํ ๋ง์น๋ฉด
true
๋ฅผ ๋ฐํํ๋ค.
public boolean search(String str) {
Node cur = this.root;
for (int i = 0; i < str.length(); i++) {
char now = str.charAt(i);
if(!cur.children.containsKey(now)) return false;
cur = cur.children.get(now);
}
return cur.isEnd;
}
ex โจ
a. ์์ ๋ฌธ์์ธ b๊ฐ root์ ์์ ๋
ธ๋๋ก ์กด์ฌํ๋๊ฐ? YES
b. e๊ฐ b์ ์์๋
ธ๋๋ก ์กด์ฌํ๋๊ฐ? YES
c. s๊ฐ e์ ์์๋
ธ๋๋ก ์กด์ฌํ๋๊ฐ? YES
d. t๊ฐ s์ ์์๋
ธ๋๋ก ์กด์ฌํ๋๊ฐ? YES
e. t ๋
ธ๋์ isEnd
= true
์ธ๊ฐ? YES
(4) ์ญ์
์ญ์ ์ ๊ฒฝ์ฐ, ์ ๊ฒฝ ์จ์ค์ผ ํ ๊ฒ์ด ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋ค.
- 1๏ธโฃ ์กฐํ์ ๊ฐ์ด ํ์ฌ ๋ณด๊ณ ์๋ ๋ฌธ์์ด์ ๋๊น์ง ๋ด๋ ค๊ฐ๋ค. (์ด๋, ์กฐํ ํธ๋ผ์ด ๋ด์์ ๋ฌธ์์ด์ ์ผ๋ถ๊ฐ ์๋๊ฒ ํ์ธ๋๋ฉด ๋ฐ๋ก false ๋ฐํ)
- 2๏ธโฃ ํ์ฌ ๋๋ฌธ์์ ๋
ธ๋๋ฅผ
b
๋ผ๊ณ ํ์.- 2๏ธโฃ - 1) ๋ง์ฝ b์
isEnd
=false
์ด๋ฉด ์ญ์ ํ๊ณ ์ ํ๋ ๋ฌธ์์ด์ ํธ๋ผ์ด ๋ด๋ถ์ ์กด์ฌํ์ง ์๋๋ค๋ ์๋ฏธ์ด๋ฏ๋กfalse
๋ฅผ ๋ฐํํ๋ค. - 2๏ธโฃ - 2) ๋ง์ฝ b์๊ฒ ์์ ๋ ธ๋๊ฐ ์กด์ฌํ์ง ์๋๋ค๋ฉด, ๋ถ๋ชจ๋ ธ๋์ children์์ b๋ฅผ ์ญ์ ํ๋ค.
- 2๏ธโฃ - 3) ์์๋
ธ๋๊ฐ ์กด์ฌํ๋ค๋ฉด
isEnd
=true
๋ก ๋ฐ๊พธ๊ณ , ๋ถ๋ชจ ๋ ธ๋๋ก ๋ค์ ๋์๊ฐ๋ค. (์ฌ๊ท ์ด์ฉ)
- 2๏ธโฃ - 1) ๋ง์ฝ b์
- 3๏ธโฃ ์ด์ b์ ๋ถ๋ชจ๋ ธ๋๊ฐ ์๋ก์ด b๊ฐ ๋ ๊ฒ์ด๋ค. ์์ 2๏ธโฃ ๋ฒ์ ๋ชจ๋ ๋ฌธ์์ด์ ๋ํด ์ํํ๋ค.
isEnd
= true
๋ก ๋ฐ๊พผ๋ค์ ์๋ฏธ๋ ์ด์ ์
๋ ฅ์ผ๋ก ๋ฐ์ ํ ๋ฌธ์์ด์ด ํธ๋ผ์ด ๋ด์ ์กด์ฌํ์ง ์๋๋ค๋ ๊ฒ์ ๋ช
์ํ๋ ๊ฒ์ด๋ค. ์์ ์ฝ์
๊ณผ ์กฐํ๋ ํธ๋ฆฌ ๋ด์์ ๋จ๋ฐฉํฅ ์ด๋๋ง ๊ตฌํํ๋ฉด ๋์ด์ ๋ฐ๋ณต๋ฌธ์ผ๋ก ์ฝ๊ฒ ๊ตฌํํ์ผ๋, ์ด์ ๋ ๋๊น์ง ๊ฐ์ ๋๋์์ฌ ๋ ์์
์ ํด์ผ ํ๋ฏ๋ก, ์ฌ๊ท
๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
public boolean delete(String str) {
return delete(this.root, str,0);
}
private boolean delete(Node cur, String str, int idx) {
char now = str.charAt(idx); // ํ์ฌ ์ง์ธ๊ฐ
if(!cur.children.containsKey(now)) return false; // ์ด ๊ฐ์ ๊ฐ์ง๊ณ ์์ง ์์ผ๋ฉด false ๋ฐํ
Node child = cur.children.get(now); // ํ์ฌ ์ง์ธ๊ฐ์ ๊ฐ๋ฆฌํค๋ ๊ฐ์ฒด๋ก ์ด๋
idx++; // ๋ค์ ์ง์ธ ๊ฐ์ ๋ณด๊ธฐ ์ํจ
if(idx == str.length()){ // ํ์ฌ ๋ฌธ์๊ฐ ๋ฌธ์์ด์ ๋์ด๋ฉด
if(!child.isEnd) return false; // ๊ทผ๋ฐ ํธ๋ผ์ด ํธ๋ฆฌ ๋ด์์๋ ๋์ด๋ผ ํ์ ๋์ด ์์ง ์์ผ๋ฉด, delete ๊ณ์ฐ ์ ๋ถํฐ ๋ญ๊ฐ ์๋ชป๋ ๊ฒ: false ๋ฐํ
child.isEnd = false; // ๋์ด๋ผ ํ์ ๋์ด ์๋ค๋ฉด, ์ด์ ๋์ด์ ํด๋น ๊ฐ์ ๋์ผ๋ก ๊ฐ์ง๋ ๋ฌธ์๋ ์์์ผ๋ก, false๋ก ์ ํ
if(child.children.isEmpty()) cur.children.remove(now); // ํธ๋ผ์ด ๋ด์์๋ ํด๋น ๋ฌธ์๊ฐ ๋ ๋
ธ๋ ์ด๋ฉด, ํด๋น ๋
ธ๋๋ฅผ ์ง์๋ฒ๋ฆผ
}else { // ํ์ฌ ๋ณด๋ ๋ฌธ์๊ฐ ์ง์ฐ๋ ค๋ ๋ฌธ์์ด์ ๋์ด ์๋๋ฉด
if (!this.delete(child, str, idx)) return false; // ๋ค์ ๋ฌธ์๋ฅผ ์กฐํํ์ฌ ์ญ์ ์ฌ๋ถ๋ฅผ ๋ฐ์ง (์ฌ๊ท) => ๊ทผ๋ฐ ์ญ์ ๋์ง ์์ผ๋ฉด delete๊ฐ ์๋๋ค๋ ์๋ฆฌ์ false ๋ฐํ
if (!child.isEnd && child.children.isEmpty()) cur.children.remove(now); // ์ด์ ๊บผ ๋ค ์ญ์ ํ๊ณ , ํ์ฌ ๋
ธ๋๊ฐ ์ด๋ค ๋ฌธ์์ ๋์ด ์๋๋ฉฐ, ๋ค๋ก ๋ฌธ์์ด์ด ๋น์ด ์๋ค๋ฉด ์ญ์ ํ๋ค.
}
return true;
}
(5) ์ ์ฒด ์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
}
}
class Tri {
Node root;
public Tri () {
root = new Node();
}
public void insert(String str) {
Node cur = this.root; // ์ด๊ธฐํ
for (int i = 0; i < str.length(); i++) {
char now = str.charAt(i);
cur.children.putIfAbsent(now, new Node());
cur = cur.children.get(now);
}
cur.isEnd = true;
}
public boolean search(String str) {
Node cur = this.root;
for (int i = 0; i < str.length(); i++) {
char now = str.charAt(i);
if(!cur.children.containsKey(now)) return false;
cur = cur.children.get(now);
}
return cur.isEnd;
}
public boolean delete(String str) {
return delete(this.root, str,0);
}
private boolean delete(Node cur, String str, int idx) {
char now = str.charAt(idx); // ํ์ฌ ์ง์ธ๊ฐ
if(!cur.children.containsKey(now)) return false; // ์ด ๊ฐ์ ๊ฐ์ง๊ณ ์์ง ์์ผ๋ฉด false ๋ฐํ
Node child = cur.children.get(now); // ํ์ฌ ์ง์ธ๊ฐ์ ๊ฐ๋ฆฌํค๋ ๊ฐ์ฒด๋ก ์ด๋
idx++; // ๋ค์ ์ง์ธ ๊ฐ์ ๋ณด๊ธฐ ์ํจ
if(idx == str.length()){ // ํ์ฌ ๋ฌธ์๊ฐ ๋ฌธ์์ด์ ๋์ด๋ฉด
if(!child.isEnd) return false; // ๊ทผ๋ฐ ํธ๋ผ์ด ํธ๋ฆฌ ๋ด์์๋ ๋์ด๋ผ ํ์ ๋์ด ์์ง ์์ผ๋ฉด, delete ๊ณ์ฐ ์ ๋ถํฐ ๋ญ๊ฐ ์๋ชป๋ ๊ฒ: false ๋ฐํ
child.isEnd = false; // ๋์ด๋ผ ํ์ ๋์ด ์๋ค๋ฉด, ์ด์ ๋์ด์ ํด๋น ๊ฐ์ ๋์ผ๋ก ๊ฐ์ง๋ ๋ฌธ์๋ ์์์ผ๋ก, false๋ก ์ ํ
if(child.children.isEmpty()) cur.children.remove(now); // ํธ๋ผ์ด ๋ด์์๋ ํด๋น ๋ฌธ์๊ฐ ๋ ๋
ธ๋ ์ด๋ฉด, ํด๋น ๋
ธ๋๋ฅผ ์ง์๋ฒ๋ฆผ
}else { // ํ์ฌ ๋ณด๋ ๋ฌธ์๊ฐ ์ง์ฐ๋ ค๋ ๋ฌธ์์ด์ ๋์ด ์๋๋ฉด
if (!this.delete(child, str, idx)) return false; // ๋ค์ ๋ฌธ์๋ฅผ ์กฐํํ์ฌ ์ญ์ ์ฌ๋ถ๋ฅผ ๋ฐ์ง (์ฌ๊ท) => ๊ทผ๋ฐ ์ญ์ ๋์ง ์์ผ๋ฉด delete๊ฐ ์๋๋ค๋ ์๋ฆฌ์ false ๋ฐํ
if (!child.isEnd && child.children.isEmpty()) cur.children.remove(now); // ์ด์ ๊บผ ๋ค ์ญ์ ํ๊ณ , ํ์ฌ ๋
ธ๋๊ฐ ์ด๋ค ๋ฌธ์์ ๋์ด ์๋๋ฉฐ, ๋ค๋ก ๋ฌธ์์ด์ด ๋น์ด ์๋ค๋ฉด ์ญ์ ํ๋ค.
}
return true;
}
}
class Node {
HashMap<Character, Node> children;
boolean isEnd;
public Node(){
children = new HashMap<>();
this.isEnd = false;
}
}