์๋ ํ์ธ์! KB IT's Your Life 7๊ธฐ ๊ธฐ์๋จ์ ๋๋ค!
์ฝ๋ฉํ ์คํธ ํน๊ฐ์ด ์ด๋๋ง ๋๋๊ฐ๊ณ ์๋๋ฐ์!
์์ง๋ ๋๋ฌด๋๋ฌด ์ด๋ ต๊ณ ํ๋๋ค์ ใ ใ ...
์ค๋์ ํธ๋ฆฌ์ ๊ธฐ๋ณธ ๊ฐ๋ ๋ถํฐ DFS, BFS ๊ตฌํ, ๊ทธ๋ฆฌ๊ณ ์ ์·์ค์·ํ์ ์ํ๊น์ง
์์ ์์ ๋ฐฐ์ด ๋ด์ฉ์ ์ ๋ฆฌํด๋ดค์ผ๋ ๋๊น์ง ์ฝ์ด์ฃผ์ธ์!
ํธ๋ฆฌ(Tree)๊ฐ ๋ญ๋ฐ?
ํธ๋ฆฌ๋ ๊ทธ๋ํ์ ํน์ํ ํํ์์.
์ผ๋ฐฉํฅ์ด๊ณ , ๋น์ํ์ด๊ณ , ๋ถ๋ชจ-์์ ๊ด๊ณ๋ก ๋งบ์ด์ง๋ ๊ณ์ธตํ ์๋ฃ๊ตฌ์กฐ์ฃ
์ฝ๊ฒ ๋งํ๋ฉด ์ปดํจํฐ ํด๋ ๊ตฌ์กฐ๋ฅผ ์๊ฐํ๋ฉด ๋ผ์. C๋๋ผ์ด๋ธ ์์ ๋ฌธ์ ํด๋๊ฐ ์๊ณ , ๊ทธ ์์ ๋ ํ์ ํด๋๊ฐ
์๋ ๊ฒ์ฒ๋ผ ์์์ ์๋๋ก ๋ป์ด๋๊ฐ๋ ๊ตฌ์กฐ๊ฐ ๋ฐ๋ก ํธ๋ฆฌ์์.

์ฌ๊ธฐ์ ๊ผญ ์์์ผ ํ ์ฉ์ด๋ค์ด ์๋๋ฐ์!!
๋ฃจํธ ๋ ธ๋: ํธ๋ฆฌ์ ๋งจ ๊ผญ๋๊ธฐ์ ์๋ ๋ ธ๋. ๋ถ๋ชจ๊ฐ ์๋ ์ ์ผํ ๋ ธ๋์์.
๋ฆฌํ ๋ ธ๋: ์์์ด ํ๋๋ ์๋ ๋งจ ๋๋จ ๋ ธ๋.
์ฐจ์: ํน์ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ์์ ๋ ธ๋์ ๊ฐ์. ํธ๋ฆฌ ์ ์ฒด์ ์ฐจ์๋ ๊ฐ์ฅ ์์์ด ๋ง์ ๋ ธ๋์ ์ฐจ์๋ฅผ ๋ฐ๋ผ๊ฐ์.
๋ ๋ฒจ: ๋ฃจํธ ๋ ธ๋์์๋ถํฐ์ ๊ฑฐ๋ฆฌ. ๋ฃจํธ๊ฐ ๋ ๋ฒจ 0์ด๋ฉด ๋ฐ๋ก ์๋๊ฐ ๋ ๋ฒจ 1, ๊ทธ ์๋๊ฐ ๋ ๋ฒจ 2...
์กฐ์ ๋ ธ๋: ํน์ ๋ ธ๋์ ๋ถ๋ชจ, ๋ถ๋ชจ์ ๋ถ๋ชจ, ์ญ ์ฌ๋ผ๊ฐ๋ ๋ชจ๋ ๋ ธ๋.
์ด ์ฉ์ด๋ค์ด ๋์ค์ ๋ฌธ์ ํ ๋ ๊ณ์ ๋์ค๋๊น ์ฌ๊ธฐ์ ํ์คํ ์ก๊ณ ๊ฐ๋ ๊ฒ ์ข์์!

ํธ๋ฆฌ์ ์ข ๋ฅ — ์ด์งํธ๋ฆฌ, ์์ ์ด์งํธ๋ฆฌ, N์งํธ๋ฆฌ
ํธ๋ฆฌ์๋ ์ข ๋ฅ๊ฐ ์์ด์. ๊ทธ๋ํ์ ์ข ๋ฅ๊ฐ ์๋ฏ์ด!
์ด์งํธ๋ฆฌ(Binary Tree): ๋ชจ๋ ๋ ธ๋๊ฐ ์ต๋ 2๊ฐ์ ์์๋ง ๊ฐ์ง๋ ํธ๋ฆฌ์์.
์ผ์ชฝ ์์, ์ค๋ฅธ์ชฝ ์์ ์ด๋ ๊ฒ ๋ถ๋ฅด๊ณ , ํ๋๋ง ์์ด๋ ๊ด์ฐฎ์์.

์์ ์ด์งํธ๋ฆฌ: ์ด์งํธ๋ฆฌ์ธ๋ฐ ๋ง์ง๋ง ๋ ๋ฒจ ๋นผ๊ณ ๋ ๋ค ๊ฝ ์ฑ์์ ธ ์๊ณ ,
๋ง์ง๋ง ๋ ๋ฒจ๋ ์ผ์ชฝ๋ถํฐ ์์๋๋ก ์ฑ์์ง ํํ์์.
N์งํธ๋ฆฌ: ์์ ๋ ธ๋๋ฅผ N๊ฐ๊น์ง ๊ฐ์ง ์ ์๋ ์ผ๋ฐ์ ์ธ ํธ๋ฆฌ.
ํน๋ณํ ์ ์ฝ ์์ด ์์ ๋กญ๊ฒ ๋ป์ด๋๊ฐ๋ ํํ๋ผ๊ณ ๋ณด์๋ฉด ๋ผ์.
๊ฐ์ฌ๋์ด "ํธ๋ฆฌ์ ์ข ๋ฅ๋ ๊ทธ๋ํ ์ข ๋ฅ๋ณด๋ค ๋ฌธ์ ์์ ์ง์ ์ ์ธ ์ฐ๊ด์ด ์๋ค"๊ณ ํ์ จ๋๋ฐ
์ค์ ๋ก ์ด์งํธ๋ฆฌ๋ N์งํธ๋ฆฌ๋์ ๋ฐ๋ผ ์ฝ๋ ๊ตฌํ ๋ฐฉ์์ด ๋ฌ๋ผ์ง๋๋ผ๊ณ ์.
ํธ๋ฆฌ ๊ตฌํ — ์ธ์ ๋ฆฌ์คํธ, ๊ฐ์ ๋ฆฌ์คํธ, ํด๋์ค
์ถ์ฒ ์ ๋ ฅ
ํธ๋ฆฌ๋ฅผ ์ฝ๋๋ก ์ด๋ป๊ฒ ํํํ๋๋? ์ด๊ฒ ํต์ฌ์ด์์ด์.

์ธ์ ๋ฆฌ์คํธ
๊ทธ๋ํ ๋ ํ๋ ๊ทธ ์ธ์ ๋ฆฌ์คํธ ๋ง์์! ํธ๋ฆฌ๋ ๊ฒฐ๊ตญ ๊ทธ๋ํ์ ์ผ์ข ์ด๋๊น ๋๊ฐ์ด ์ธ ์ ์์ด์.
์ผ๋ฐฉํฅ ํธ๋ฆฌ๋ฉด ๋ถ๋ชจ์์ ์์ ๋ฐฉํฅ์ผ๋ก๋ง ๋ฃ์ผ๋ฉด ๋๊ณ
์๋ฐฉํฅ์ผ๋ก ์ฃผ์ด์ง๋ ๊ฒฝ์ฐ๋ ์๋๋ฐ ๊ทธ๋๋ ๋ฌธ์ ์์ ๋ฃจํธ ๋ ธ๋๋ฅผ ๋ฐ๋ก ์๋ ค์ค์.
๊ฐ์ ๋ฆฌ์คํธ
"0๋ฒ์ด๋ 1๋ฒ ์ฐ๊ฒฐ, 0๋ฒ์ด๋ 2๋ฒ ์ฐ๊ฒฐ, 2๋ฒ์ด๋ 3๋ฒ ์ฐ๊ฒฐ..."
์ด๋ฐ ์์ผ๋ก ์ฐ๊ฒฐ ์ ๋ณด๋ง ์ญ ๋์ดํ ํํ์ธ๋ฐ DFS๋ BFS ์ฐ๋ ค๋ฉด
๊ฒฐ๊ตญ ์ธ์ ๋ฆฌ์คํธ๋ก ๋ณํํด์ผ ํด์ ํ ๋จ๊ณ๋ฅผ ๋ ๊ฑฐ์ณ์.
ํด๋์ค ๊ตฌํ (๋ ธ๋)
์ด๊ฒ ์ข ์๋ก์ ์ด์! ์ด์งํธ๋ฆฌ๋ฅผ ํด๋์ค๋ก ๊ตฌํํ๋ฉด ์ด๋ฐ ์์ด์์:
class Node {
int value;
Node left;
Node right;
Node(int value) {
this.value = value;
}
}
value์ ๊ฐ์ ์ ์ฅํ๊ณ , left๋ right๋ก ์์ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ตฌ์กฐ. ๋ฃจํธ ๋ ธ๋ ํ๋๋ง ์๋ฉด ๊ฑฐ๊ธฐ์๋ถํฐ
left, right๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉด์ ์ ์ฒด ํธ๋ฆฌ์ ์ ๊ทผ์ด ๊ฐ๋ฅํด์.
N์งํธ๋ฆฌ์ผ ๋๋ left, right ๋์ List<Node> children์ผ๋ก ์์ ๋ ธ๋๋ฅผ ๋ฆฌ์คํธ์ ๋ด์ผ๋ฉด ๋๊ณ ์.
ํธ๋ฆฌ ์ํ — BFS (๋๋น ์ฐ์ ํ์)
์ ์ด์ ํธ๋ฆฌ๋ฅผ ๋ง๋ค์์ผ๋ฉด ์ํ๋ฅผ ํด์ผ์ฃ !
๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด๋จ์ผ๋ฉด ๊บผ๋ด์ ํ์ธํ ์ ์์ด์ผ ์๋ฏธ๊ฐ ์์ผ๋๊น์
BFS๋ ๊ฐ์ ๋ ๋ฒจ์ ์๋ ๋ ธ๋๋ค์ ๋จผ์ ๋ค ๋ฐฉ๋ฌธํ๊ณ ๊ทธ๋ค์ ๋ ๋ฒจ๋ก ๋์ด๊ฐ๋ ๋ฐฉ์์ด์์.
๊ทธ๋์ ๋ ๋ฒจ ์์ ์ํ๋ผ๊ณ ๋ ๋ถ๋ฌ์.

๊ตฌํ๋ ๊ทธ๋ํ ๋ ํ๋ ๊ฑฐ๋ ๊ฑฐ์ ๋๊ฐ์์. ํ(Queue) ์ฐ๋ฉด ๋!
๊ทผ๋ฐ ์ฌ๊ธฐ์ ์ค์ํ ํฌ์ธํธ๊ฐ ํ๋ ์์๋๋ฐ์, ์ผ๋ฐฉํฅ ํธ๋ฆฌ์์๋ visited ๋ฐฐ์ด์ด ํ์ ์์ด์!
๊ทธ๋ํ์์๋ ์๋ฐฉํฅ์ด๋ผ ๊ฐ๋ ๋ฐ๋ฅผ ๋ ๊ฐ๊ณ ๋ ๊ฐ๊ณ ๋ฌดํ ๋ฃจํ๊ฐ ๋ ์ ์์์์.
๊ทผ๋ฐ ์ผ๋ฐฉํฅ ํธ๋ฆฌ๋ ๋ถ๋ชจ์์ ์์์ผ๋ก๋ง ๊ฐ๋๊น ํ๋ฒ ๋ด๋ ค๊ฐ๋ฉด ๋ค์ ์ฌ๋ผ์ฌ ์ผ์ด ์์ด์.
์ํ๋ ์๊ณ ์ผ๋ฐฉํฅ์ด๋๊น visited ์ฒดํฌ ์์ด๋ ์์ ํ๊ฒ ๋ ์ ์๋ ๊ฑฐ์์.
๋ฌผ๋ก ์๋ฐฉํฅ์ผ๋ก ์ฃผ์ด์ง๋ฉด visited๋ฅผ ์จ์ผ ํฉ๋๋ค!
ํธ๋ฆฌ ์ํ — DFS (๊น์ด ์ฐ์ ํ์)
ํธ๋ฆฌ์์๋ ์ฌ์ค DFS๊ฐ ํจ์ฌ ๋ง์ด ์ฐ์ฌ์. ์๋๋ฉด ํธ๋ฆฌ ์์ฒด๊ฐ ์ฌ๊ท์ ์ธ ๊ตฌ์กฐ๊ฑฐ๋ ์.
๋ฃจํธ ๋ ธ๋ ์๋์ ์๋ธํธ๋ฆฌ๊ฐ ์๊ณ ๊ทธ ์๋ธํธ๋ฆฌ๋ ์์ธํ ๋ณด๋ฉด ๋ ๋ฃจํธ ๋ ธ๋์ ์๋ธํธ๋ฆฌ๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ ...
์ด๊ฒ ๋ฑ ์ฌ๊ท ๊ตฌ์กฐ์์์!
๊ทธ๋์ DFS๋ก ํธ๋ฆฌ๋ฅผ ์ํํ ๋๋ ์ด๋ฐ ํ๋ฆ์ด์์

- ํ์ฌ ๋ ธ๋ ๋ฐฉ๋ฌธ
- ์์ ๋ ธ๋๋ค์ ๋ํด DFS ์คํ
- ๋๊น์ง ๊ฐ๋ค๊ฐ ๋์์ค๊ธฐ
๊ทผ๋ฐ ์ฌ๊ธฐ์ ํ์ฌ ๋ ธ๋๋ฅผ ์ธ์ ์ฒ๋ฆฌํ๋๋์ ๋ฐ๋ผ ์ธ ๊ฐ์ง๋ก ๋๋์ด์. ์ด๊ฒ ๋ฐ๋ก ์ ์์ํ, ์ค์์ํ, ํ์์ํ!
์ ์์ํ · ์ค์์ํ · ํ์์ํ
์ ์์ํ (Pre-order)
๋ ๋จผ์ ์ฒ๋ฆฌํ๊ณ → ์์ ๋ ธ๋ DFS
ํ์ฌ ๋ ธ๋์ ๋์ฐฉํ์๋ง์ ๋ฐ๋ก ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๊ณ ๊ทธ๋ค์ ์์๋ค์ ํ์ํ๋ ๋ฐฉ์์ด์์.
๋๋ ํ ๋ฆฌ(ํด๋) ๊ตฌ์กฐ๋ฅผ ์ถ๋ ฅํ ๋ ์ด๋ฐ ๋ฐฉ์์ ์ด๋ค๊ณ ํด์.
ํด๋์ ๋ค์ด๊ฐ๋ฉด ์ผ๋จ ํด๋ ์ด๋ฆ์ ํ์ธํ๊ณ ๊ทธ ์์ ์๋ ํ์ ํด๋๋ฅผ ๋ ํ์ํ๋ ๊ฑฐ์ฃ .
์ค์์ํ (In-order)
์ผ์ชฝ ์์ DFS → ๋ ์ฒ๋ฆฌ → ์ค๋ฅธ์ชฝ ์์ DFS
์ด์งํธ๋ฆฌ์์๋ง ์ฐ์ด๋ ์ํ ๋ฐฉ์์ด์์. ์ด์ง ํ์ ํธ๋ฆฌ(BST)๋ฅผ ์ค์์ํํ๋ฉด ์ค๋ฆ์ฐจ์ ์ ๋ ฌ๋ ์ซ์๊ฐ ๋์จ๋ค๋ ํน์ฑ์ด ์์ด์. ๊ฐ์ฌ๋์ด ์ด๊ฑด ์ถ์ ๋น๋๊ฐ ๋์ง ์๋ค๊ณ ํ์ จ์ง๋ง ์์๋๋ฉด ์ข์ ๊ฐ๋ !

ํ์์ํ (Post-order)
์์ ๋ ธ๋ DFS ๋ค ํ๊ณ → ๊ทธ ๋ค์์ ๋ ์ฒ๋ฆฌ
์ฝ๋ฉํ ์คํธ์์ ๊ฐ์ฅ ๋ง์ด ์ฐ์ด๋ ๊ฑด ํ์์ํ์ ๋๋ค!!
์ ๊ทธ๋ฌ๋๋ฉด ์์ ๋ ธ๋๋ค์ด ์์์ ์๊ธฐ ํ ์ผ ํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํ๋ฉด
๋ถ๋ชจ ๋ ธ๋๊ฐ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ทจํฉํด์ ์ต์ข ๋ต์ ๋ง๋๋ ๊ตฌ์กฐ๊ฐ ๋๋ถ๋ถ์ด๊ฑฐ๋ ์.
์๋ฅผ ๋ค์ด ์ด ํธ๋ฆฌ์ ์ ์ฒด ๋ ธ๋ ๊ฐ์๋ฅผ ๊ตฌํด๋ผ ๊ฐ์ ๋ฌธ์ . DFS ํจ์๊ฐ ์์๋คํํ "๋๋ค ๋ฐ์ ๋ ธ๋ ๋ช ๊ฐ์ผ?"
์ํค๋ฉด, ์์๋ค์ด ์์์ ์ธ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํ๊ณ ๋ถ๋ชจ๋ ๊ทธ๊ฑฐ ๋ค ๋ํ ๋ค์์ ์๊ธฐ ์์ +1๋ง ํ๋ฉด ๋์ด์์.
int dfs(int root, List<List<Integer>> tree) {
int answer = 1; // ๋ ์์ ํฌํจ
for (int child : tree.get(root)) {
answer += dfs(child, tree);
}
return answer;
}
์ด ์ฝ๋ ํ๋๋ก ์ ์ฒด ๋ ธ๋ ๊ฐ์๊ฐ ๋์์.

๊ฐ์ ๊ตฌ์กฐ๋ก ๋ ธ๋ ๊ฐ์ ์ดํฉ๋ ๊ตฌํ ์ ์์ด์. answer = 1 ๋์ answer = values[root]๋ก ๋ฐ๊พธ๋ฉด ๋! ์์๋ค์ด ๋ฆฌํดํ ํฉ์ ๋ค ๋ํ๊ณ , ๋์ ๊ฐ์ ๋ํ๋ฉด ์ ์ฒด ์ดํฉ์ด ๋์ค๋ ๊ฑฐ์์.
**์ต๋ ๊น์ด(Maximum Depth)**๋ ํ์์ํ๋ก ํ ์ ์์์ด์. ์์๋คํํ "๋๋ค ์ชฝ ์ต๋ ๊น์ด๊ฐ ๋ช์ด์ผ?" ๋ฌผ์ด๋ณด๊ณ , ๊ทธ์ค ์ ์ผ ๊น์ ๊ฑฐ ๊ณจ๋ผ์ +1 ํ๋ฉด ๋!
ํต์ฌ ํฌ์ธํธ๋ฅผ ์ ๋ฆฌํ ๊ฒ์
- ๋ ธ๋๊ฐ N๊ฐ๋ฉด ๊ฐ์ ์ N-1๊ฐ ํธ๋ฆฌ์์๋ ๋ฃจํธ ๋ ธ๋ ๋นผ๊ณ ๋ชจ๋ ๋ ธ๋๊ฐ ๋ถ๋ชจ์ ์ฐ๊ฒฐ๋ผ ์์ผ๋๊น ๊ฐ์ ๊ฐ์๋ ํญ์ ๋ ธ๋ ์ - 1์ด์์. ๋ฌธ์ ์์ "๊ฐ์ ์ด N-1๊ฐ" ๋์ค๋ฉด "์ ์ด๊ฑฐ ํธ๋ฆฌ ๋ฌธ์ ๊ตฌ๋!" ๋ฐ๋ก ํ์ ๊ฐ๋ฅ!
- DFS๋ฅผ ๋๋ฆฐ๋ค = ํธ๋ฆฌ์ ์ ๋ณด๋ฅผ ์ทจํฉํ๋ ๊ฒ DFS ์คํ ์์ฒด๊ฐ ์๋ธํธ๋ฆฌ์ ์ ๋ณด๋ฅผ ๋ชจ์์ ์๋ก ์ฌ๋ ค๋ณด๋ด๋ ๊ณผ์ ์ด์์. ์์ํํ ์ํค๊ณ → ๊ฒฐ๊ณผ ๋ฐ์์ → ๋ด๊ฐ ์ฒ๋ฆฌํ๋ ๊ตฌ์กฐ.
- ์ฌ๊ท์ ์ฌ๊ณ ๊ฐ ํต์ฌ ์ ์ฒด๋ฅผ ํ๋ฒ์ ํ๋ ค๊ณ ํ์ง ๋ง๊ณ ๋ด๊ฐ ํ ์ผ์ ์ ์ํ๊ณ
์์๋คํํ ๋๊ฐ์ด ์ํค๋ฉด ํธ๋ฆฌ ์ ์ฒด๊ฐ ํด๊ฒฐ๋๋ค.
์ด๊ฒ ํธ๋ฆฌ + DFS ๋ฌธ์ ํ์ด์ ๋ณธ์ง์ด์์ด์.
๋ง์น๋ฉฐ
์๋ฌด๋ฆฌ ๋ด๋ ๋ด๋ ์ด๋ ต๊ณ ์์ง ๊ฐ ๊ธธ์ด ๋ฉ์ง๋ง ํ๋์ฉ ์์๊ฐ๋ ๋๋์ด ๋ค์ด์ ์ข์ต๋๋ค.
๊ณ์ํด์ ๋ฐ๋ณตํ๋ค๋ณด๋ฉด ์ ๋ ๊ณ ์๊ฐ ๋ ์ ์๊ฒ ์ฃ ...?
์ง๊ธ๊น์ง ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค !! ๋ค์ ํฌ์คํ ์์ ๋ด์!