
์ ์ฆ์ DFS์ BFS.. ์ดํด์ ๋๋ ์ค ์์๋๋ฐ ๋์ด์
๋ฅผ ๊ธฐ๋
ํ๋ฉฐ DFS์ BFS์ ๋ํด ์ค๋ช
ํด๋ณด๋ ค๊ณ ํฉ๋๋ค.
์ ๋ ์ฝ๋๋ฅผ ๋ณด๊ธฐ ๋ณด๋ค ๋จผ์ ๋จธ๋ฆฌ๋ก ์ดํดํ๋ ๊ฒ์ด ๋์ค์ ์ํด์ ์ข๋๋ผ๊ณ ์
์ฝ๋๋ฅผ ์ธ์ฐ๊ธฐ ๋ณด๋ค๋ ์๋ฆฌ๋ฅผ ์ดํดํ๊ณ ์ ๊ทผํ๋ ๊ฒ์ด ์์ฉ ๋ฌธ์ ํน์ ์ค์ ๋ฌธ์ ์ํฉ์ ๋๋นํ๊ธฐ์ ์ ํฉํ ๊ฒ ๊ฐ์ต๋๋ค
๊ทธ๋ผ ์์!

DFS๋ ์ฝ์์
๋๋ค.
Depth-First Search์ ์ฝ์์ ๋๋ค.
'๊น์ด ์ฐ์ ํ์'์ด๋ผ๊ณ ํ์ฃ
DFS๋ ํ ๊ฒฝ๋ก๋ฅผ ๋๊น์ง ํ๊ณ ๋ค์ด์ ํ์ํ ๋ค์, ๋ ์ด์ ๊ฐ ๊ณณ์ด ์์ผ๋ฉด ๋ค๋ก ๋์์์ ๋ค๋ฅธ ๊ฒฝ๋ก๋ฅผ ํ์ํ๋ ๋ฐฉ์์
๋๋ค.
'๊น์ด'๋ฅผ ์ฐ์ ํด์ ํ์ํ๋ค๋ ์๋ฏธ์
๋๋ค
๐ ๋์ ๊ณผ์
- ์์ ๋
ธ๋ ๋ฐฉ๋ฌธ
- ์ถ๋ฐ ์ง์ ์์ ํ์์ ์์ํฉ๋๋ค.
- ์ด ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ(visited ํ์)ํฉ๋๋ค.
- ์ฐ๊ฒฐ๋ ๋
ธ๋ ์ค ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋๋ก ์ด๋
- ํ์ฌ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ ธ๋๋ค ์ค์์ ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ฅผ ์ ํํฉ๋๋ค.
- ์ ํ๋ ๋ ธ๋๋ก ์ด๋ํด์ ๋ค์ ๊ฐ์ ๊ณผ์ ์ ๋ฐ๋ณตํฉ๋๋ค.
- ๋ ์ด์ ๊ฐ ๊ณณ์ด ์์ผ๋ฉด ๋ค๋ก(backtrack)
- ํ์ฌ ๋
ธ๋์์ ๋ ์ด์ ๋ฐฉ๋ฌธํ ์ ์๋ ์๋ก์ด ๋
ธ๋๊ฐ ์๋ค๋ฉด,
์ด์ ๋จ๊ณ(๋ฐ๋ก ์ ๋ ธ๋)๋ก ๋์๊ฐ๋๋ค. - ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ๋ฐฉ๋ฌธํ์ง ์์ ๊ฒฝ๋ก๊ฐ ์๋์ง ํ์ธํฉ๋๋ค.
- ํ์ฌ ๋
ธ๋์์ ๋ ์ด์ ๋ฐฉ๋ฌธํ ์ ์๋ ์๋ก์ด ๋
ธ๋๊ฐ ์๋ค๋ฉด,
- ๋ชจ๋ ๋
ธ๋ ๋ฐฉ๋ฌธํ ๋๊น์ง ๋ฐ๋ณต
- ๋ชจ๋ ๊ฒฝ๋ก๋ฅผ ํ์ํ๋ฉด ์ข ๋ฃํฉ๋๋ค.
DFS์ ๊ตฌํ ๋ฐฉ์
DFS๋ ํฌ๊ฒ ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ๊ตฌํ๋ฉ๋๋ค.
1. ์ฌ๊ท ๋ฐฉ์
function dfs(node) {
visited.add(node);
for (let next of graph[node]) {
if (!visited.has(next)) {
dfs(next);
}
}
}
์ด ๋ฐฉ์์ ์ฝ๋๊ฐ ๊ฐ๊ฒฐํ์ง๋ง, ๋๋ฌด ๊น์ ๊ทธ๋ํ์์๋ ์ฌ๊ท ํธ์ถ์ด ๋ง์์ ธ์ ์คํ ์ค๋ฒํ๋ก์ฐ ์ํ์ด ์์.
2. ์คํ ๋ฐฉ์
function dfsStack(start) {
let stack = [start];
while (stack.length) {
let node = stack.pop();
if (!visited.has(node)) {
visited.add(node);
stack.push(...graph[node]);
}
}
}
์ฌ๊ท ๋์ ๋ช
์์ ์ผ๋ก ์คํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉ.
DFS ํน์ง?
- ๊น์ด ์ฐ์ โ ํ ๊ฒฝ๋ก๋ฅผ ๋๊น์ง ํ์ ํ ๋์์ด.
- ์ฌ๊ท๋ ์คํ์ ์ด์ฉํด ๊ตฌํ.
- ๋ชจ๋ ๊ฒฝ์ฐ์ ์ ํ์์ด๋ ๋ฐฑํธ๋ํน์์ ์์ฃผ ์ฐ์.
- ์ต๋จ ๊ฑฐ๋ฆฌ ๋ณด์ฅ X โ BFS์ ๋ฌ๋ฆฌ, ๋จผ์ ์ฐพ์ ํด๋ต์ด ์ต๋จ ๊ฒฝ๋ก๊ฐ ์๋ ์ ์์.
์ฝ๊ฒ ์๊ฐํ๋ฉด,,
ํ ๊ฒฝ๋ก๋ฅผ ๋๊น์ง ๋ฐ๋ผ๊ฐ๋ฉฐ ํ์ํ ๋ค, ๋๋์์ ๋ค๋ฅธ ๊ฒฝ๋ก๋ฅผ ํ์ํ๋ ๋ฐฉ์
์ด๋ผ๊ณ ์ดํดํ์๋ฉด ๋ฉ๋๋ค
๐DFS์ ์ ํ์ ํจ์ ์์
function dfs(node, depth) {
// node: ํ์ฌ ํ์ ์ค์ธ ๋
ธ๋(๋๋ ์์์ )
// depth: ํ์ฌ๊น์ง ๋ด๋ ค์จ ๊น์ด(๋๋ ๊ฒฝ๋ก ๊ธธ์ด)
}
1. node
โข ์ง๊ธ ๋ฐฉ๋ฌธํ๊ณ ์๋ ์์น๋ ๊ฐ.
โข ๊ทธ๋ํ ๋ฌธ์ ๋ผ๋ฉด ์ ์ ๋ฒํธ,
โข ๋ฌธ์์ด ๋ณํ ๋ฌธ์ ๋ผ๋ฉด ํ์ฌ ๋จ์ด,
โข ํธ๋ฆฌ ํ์์ด๋ผ๋ฉด ํ์ฌ ๋
ธ๋ ๊ฐ์ฒด.
2. depth / step / count (๋ฌธ์ ์ ๋ฐ๋ผ ์ ํ์ ์ผ๋ก ์ฌ์ฉ)
โข ํ์ฌ๊น์ง ์ด๋ํ ๋จ๊ณ ์, ์ฌ๊ท ๊น์ด, ํน์ ๋ณํ ํ์.
โข ์ต์ ๊ฒฝ๋ก, ์ต์ ๋ณํ ํ์ ๊ฐ์ ๋ฌธ์ ์์ ์ค์.
3. visited (๋ณดํต ์ ์ญ ๋๋ ์ธ๋ถ ๋ณ์๋ก ์ ๋ฌ)
โข ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๋
ธ๋๋ฅผ ๊ธฐ๋กํ๋ ๋ฐฐ์ด/Set/๊ฐ์ฒด.
โข ๊ฐ์ ๋
ธ๋๋ฅผ ์ค๋ณต ํ์ํ์ง ์๊ฒ ํจ.
4. target (์ ํ์ )
โข ์ด๋ค ์กฐ๊ฑด์ ๋ง์กฑํ๋์ง ์ฒดํฌํ ๋์ ๊ฐ.
โข ์: ์ฐพ๊ณ ์ถ์ ์ซ์, ๋จ์ด, ํน์ ๋์ฐฉ์ ๋
ธ๋.
โ๏ธDFS์์ ํต์ฌ ํ๋ผ๋ฏธํฐ ์กฐํฉ์ ๋ณดํต
dfs(ํ์ฌ ์์น, ํ์ฌ ๊น์ด, ๋ฐฉ๋ฌธ ๊ธฐ๋ก, ๋ชฉํ ๊ฐ)
์ด๋ ๊ฒ ๊ตฌ์ฑ๋ผ์.
BFS๋ ๊ทธ๋ผ ๋ญ๊น์
BFS(๋๋น ์ฐ์ ํ์)๋ ๊ฐ๊น์ด ๊ณณ๋ถํฐ ์ฐจ๋ก๋๋ก ํ์ํ๋ ๋ฐฉ์์
๋๋ค
์ข ๋ ์ฝ๊ฒ ๋งํ๋ฉด,
๐ถ โ์ถ๋ฐ์ ์์ ํ ๊ฑธ์์ฉ ์ฃผ๋ณ์ ์ ๋ถ ์ดํด๋ณธ ๋ค์, ๊ทธ ๋ค์ ๊ฑฐ๋ฆฌ๋ก ์ด๋ํ๋ ํ์โ
๊ฐ์ ๊ฐ๋ ์ด์ฃ .
BFS์ ํน์ง์
ํ(Queue) ์๋ฃ๊ตฌ์กฐ ์ฌ์ฉ โ ๋จผ์ ๋ค์ด์จ ๋
ธ๋๋ถํฐ ์ฒ๋ฆฌ(FIFO).
์ต๋จ ๊ฑฐ๋ฆฌ ํ์์ ์ ๋ฆฌ โ ๊ฐ์ค์น๊ฐ ์๋(์ด๋๋ง๋ค ์ฐ์ฐ์ด ๋๋) ๊ทธ๋ํ์์ ๊ฐ์ฅ ์งง์ ๊ฒฝ๋ก ๋ณด์ฅ.
ํ ๋ฒ ๋ฐฉ๋ฌธํ ๋
ธ๋๋ ๋ค์ ๋ฐฉ๋ฌธํ์ง ์๋๋ก visited ์ฒดํฌ ํ์.
๊ฐ๋จ ์์ ์ฝ๋
function bfs(start) {
const queue = [start];
const visited = new Set([start]);
while (queue.length > 0) {
const node = queue.shift();
// node ์ฒ๋ฆฌ
for (let next of node.์ธ์ ๋
ธ๋๋ค) {
if (!visited.has(next)) {
visited.add(next);
queue.push(next);
}
}
}
}
1. start / node
โข ํ์ ์์์ ๋๋ ํ์ฌ ํ์ ์ค์ธ ๋
ธ๋.
โข ๊ทธ๋ํ/ํธ๋ฆฌ ๋ฌธ์ ๋ฉด ์ ์ ๋ฒํธ๋ ๊ฐ์ฒด, ๋ฌธ์์ด ๋ณํ ๋ฌธ์ ๋ฉด ํ์ฌ ๋จ์ด.
2. depth / level / count
โข ํ์ฌ๊น์ง ์ด๋ํ ๊ฑฐ๋ฆฌ(๋จ๊ณ ์).
โข ์ต๋จ ๊ฒฝ๋ก ๋ฌธ์ ์์ ๋งค์ฐ ์ค์.
โข BFS๋ ๊ฐ๊น์ด ๊ณณ๋ถํฐ ํ์ํ๋๊น, ์ด ๊ฐ์ด ๊ทธ๋๋ก ์ต๋จ ๊ฑฐ๋ฆฌ์.
3. visited
โข ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๋
ธ๋๋ฅผ ์ ์ฅํ๋ ๊ตฌ์กฐ(Set, ๋ฐฐ์ด, ๊ฐ์ฒด).
โข ์ค๋ณต ๋ฐฉ๋ฌธ ๋ฐฉ์ง โ ๋ฌดํ ๋ฃจํ ์๋ฐฉ.
โข BFS์์๋ ๋ฐฉ๋ฌธ ์ฒดํฌ๋ฅผ ํ์ ๋ฃ์ ๋ ํ๋ ๊ฒ ๋ณดํต.
4. queue
โข ๋ค์์ ํ์ํ ๋
ธ๋๋ค์ ๋ด๋ ์๋ฃ๊ตฌ์กฐ(FIFO).
โข ๊ฐ ์์๋ ๋ณดํต [node, depth] ๊ฐ์ด ํ์ฌ ์์น์ ๋จ๊ณ ์๋ฅผ ํจ๊ป ์ ์ฅ.
5. target (์ ํ์ )
โข ์ฐพ์ผ๋ ค๋ ๊ฐ์ด๋ ์กฐ๊ฑด.
โข BFS ๋์ค ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด ์ฆ์ ํ์ ์ข
๋ฃ ๊ฐ๋ฅ.
์ ํ๋ผ๋ฏธํฐ ์ฌ์ฉ ์์
function bfs(start, target) {
const queue = [[start, 0]]; // [ํ์ฌ ๋
ธ๋, ๋จ๊ณ ์]
const visited = new Set([start]);
while (queue.length) {
const [node, depth] = queue.shift();
if (node === target) return depth;
for (let next of node.์ธ์ ๋
ธ๋๋ค) {
if (!visited.has(next)) {
visited.add(next);
queue.push([next, depth + 1]);
}
}
}
return -1; // ์ฐพ์ง ๋ชปํ ๊ฒฝ์ฐ
}
์ค๋ฌด์์๋ ์ด๋ป๊ฒ ํ์ฉํ ๊น?
DFS
DOM ํ์
HTML ํธ๋ฆฌ๋ฅผ ๊น์ด ์ฐ์ ์ผ๋ก ํ์ํด ํน์ ๋
ธ๋ ์ฐพ๊ธฐ. ์: ์ด๋ฒคํธ ์์ ์ ๋ถ๋ชจ/์์ ๊ด๊ณ ๊ฒ์
์ปดํฌ๋ํธ ๊ตฌ์กฐ ๋ถ์
React/Vue ์ปดํฌ๋ํธ ํธ๋ฆฌ์์ props/state ์ ํ ๊ฒฝ๋ก ๋ถ์
์ค์ฒฉ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
๊ณ์ธตํ ๋ฐ์ดํฐ(ํด๋ ๊ตฌ์กฐ, ๋ฉ๋ด, ๋๊ธ ์ค๋ ๋ ๋ฑ)๋ฅผ ๊น๊ฒ ๋ด๋ ค๊ฐ๋ฉฐ ์ฒ๋ฆฌ
๋ฐฑํธ๋ํน ๊ธฐ๋ฐ ๊ธฐ๋ฅ
์: ํผ ์
๋ ฅ ์ ๊ฐ๋ฅํ ๋ชจ๋ ์กฐํฉ ํ์, ํผ์ฆํ ๊ธฐ๋ฅ(์ค๋์ฟ , ๊ฒฝ๋ก ์ฐพ๊ธฐ)
BFS
์ต๋จ ๊ฒฝ๋ก ํ์
์: ์ง๋ ์๋น์ค(์ต๋จ ๊ฒฝ๋ก), UI ๋ด ์์ ๊ฐ ์ต์ ์ด๋ ํ์ ๊ณ์ฐ
๊ทผ์ ํ์ ๊ธฐ๋ฅ
์: ์ถ์ฒ ์์คํ
์์ ๊ฐ๊น์ด ๊ด๋ จ ํญ๋ชฉ๋ถํฐ ์ฐพ๊ธฐ
์ํ ์ ํ
์ค์๊ฐ ์ฑํ
๋ฐฉ, ์๋ฆผ ์์คํ
์์ ์ด๋ฒคํธ๋ฅผ ๊ฐ๊น์ด ๊ณณ๋ถํฐ ์ ๋ฌ
ํธ๋ฆฌ/๊ทธ๋ํ์์ ๋ ๋ฒจ๋ณ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
์: UI ๋ฉ๋ด์ ๊น์ด๋ณ ํ์, ๊ณ์ธตํ ๋ฐ์ดํฐ์ ๋จ๊ณ๋ณ ๋ก๋ฉ
์ด๋ ๊ฒ DFS์ BFS์ ๋ํด ์์๋ณด์์ต๋๋ค!
๋ณต์ต ๋ฐ๋ณต๋ง์ด ์ด ๊ธธ!

'Developing๐ฉโ๐ป > ์๋ฃ๊ตฌ์กฐ,์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๊ธฐ๋ณธ] ์ฌ๊ท์ ์คํ์ด๋? (1) | 2025.07.13 |
---|