Depth-First Search Algorithm(=DFS)์ ๊น์ด ์ฐ์ ํ์์ผ๋ก์, ์๋ฃ๊ตฌ์กฐ์ธ Graph๋ฅผ ํ์ํ๋ ๋ฐฉ๋ฒ์ค ํ๋์ ๋๋ค.
Graph๋ ์๋์ ๋ํ์ ๊ฐ์ด ํํํ๋ ์๋ฃ๊ตฌ์กฐ์ด๋ฉฐ, ๋๊ทธ๋ผ๋ฏธ๋ฅผ ์ ์ (Vertex) ๋๋ ๋ ธ๋(Node), ๋๊ทธ๋ผ๋ฏธ๋ฅผ ์ด์ด์ฃผ๋ ์ ์ ๊ฐ์ (Edge)์ด๋ผ๊ณ ํํํฉ๋๋ค.
flowchart LR
A((A))
B((B))
C((C))
D((D))
E((E))
F((F))
G((G))
H((H))
I((I))
A---B
B---D
B---E
D---E
A---C
C---F
F---G
G---H
G---I
I---C
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก์ ํํํ๋ฉด ์๋์ ๊ฐ์ด ํํํ ์ ์์ต๋๋ค.
graph = {
'A': ['B', 'C'],
'B': ['A', 'D', 'E'],
'C': ['A', 'F', 'I'],
'D': ['B', 'E'],
'E': ['B', 'D'],
'F': ['C', 'G'],
'G': ['F', 'H', 'I'],
'H': ['G'],
'I': ['G', 'C']
}
DFS๋ ์ Graph๋ฅผ ํ์ํ๋ ๊ฒ์ด๋ฉฐ, ์ด๋ฆ ๊ทธ๋๋ก ๊น์ด๋ฅผ ์ฐ์ ์ ์ผ๋ก ํ์ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์์ ๋ ธ๋๋ฅผ A๋ก ํ์ฌ ์๋์ ํ์ ์์๋ฅผ ์์ฑํ์์ต๋๋ค.
- ์์ ๋
ธ๋ A๋ฅผ ๋ฐฉ๋ฌธํ๊ณ , ๋ฐฉ๋ฌธํ ๋
ธ๋ ๋ชฉ๋ก์ ์ถ๊ฐํฉ๋๋ค.
- ๋ฐฉ๋ฌธํ ๋ ธ๋: [A]
- ์ธ์ ํ ๋
ธ๋๋ค ์ค ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋๋ฅผ ์ฐพ์ ์ด๋ํฉ๋๋ค. ๋
ธ๋ A์ ์ธ์ ํ ๋
ธ๋๋ค์ B์ C์
๋๋ค. ๋
ธ๋ B๋ก ์ด๋ํฉ๋๋ค.
- ๋ฐฉ๋ฌธํ ๋ ธ๋: [A, B]
- ๋
ธ๋ B์ ์ธ์ ํ ๋
ธ๋๋ค ์ค ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋๋ฅผ ์ฐพ์ต๋๋ค. ์ธ์ ํ ๋
ธ๋๋ค์ A, D, E์
๋๋ค. ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๋
ธ๋ A๋ฅผ ์ ์ธํ๊ณ ๋
ธ๋ D๋ก ์ด๋ํฉ๋๋ค.
- ๋ฐฉ๋ฌธํ ๋ ธ๋: [A, B, D]
- ๋
ธ๋ D์ ์ธ์ ํ ๋
ธ๋๋ค ์ค ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋๋ฅผ ์ฐพ์ต๋๋ค. ์ธ์ ํ ๋
ธ๋๋ค์ B์ E์
๋๋ค. ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๋
ธ๋ B๋ฅผ ์ ์ธํ๊ณ ๋
ธ๋ E๋ก ์ด๋ํฉ๋๋ค.
- ๋ฐฉ๋ฌธํ ๋ ธ๋: [A, B, D, E]
- ๋ ธ๋ E์ ์ธ์ ํ ๋ ธ๋๋ค ์ค ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ฅผ ์ฐพ์ต๋๋ค. ์ธ์ ํ ๋ ธ๋๋ค์ B์ D์ด์ง๋ง ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์ํ์ ๋๋ค. ์ด์ ๋ ธ๋์ธ D๋ก ๋์๊ฐ๋๋ค.
- ๋ ธ๋ D์์ ๋ค์ ์ธ์ ํ ๋ ธ๋ ์ค ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ฅผ ์ฐพ์ต๋๋ค. ์ด์ ์ ํ์ธํ ๋ ธ๋ E๋ฅผ ์ ์ธํ๊ณ ๋ค๋ฅธ ๋ ธ๋๊ฐ ์์ผ๋ฏ๋ก, ๋ ์ด์ ๋ฐฉ๋ฌธํ ๋ ธ๋๊ฐ ์์ต๋๋ค. ์ด์ ๋ ธ๋์ธ B๋ก ๋์๊ฐ๋๋ค.
- ๋ ธ๋ B์์ ์ธ์ ํ ๋ ธ๋ ์ค ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ฅผ ์ฐพ์ต๋๋ค. ์ด์ ์ ํ์ธํ ๋ ธ๋ D์ E๋ฅผ ์ ์ธํ๊ณ ๋ค๋ฅธ ๋ ธ๋๊ฐ ์์ผ๋ฏ๋ก, ๋ ์ด์ ๋ฐฉ๋ฌธํ ๋ ธ๋๊ฐ ์์ต๋๋ค. ์ด์ ๋ ธ๋์ธ A๋ก ๋์๊ฐ๋๋ค.
- ๋
ธ๋ A์์ ์ธ์ ํ ๋
ธ๋ ์ค ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋๋ฅผ ์ฐพ์ต๋๋ค. ๋
ธ๋ C๋ก ์ด๋ํฉ๋๋ค.
- ๋ฐฉ๋ฌธํ ๋ ธ๋: [A, B, D, E, C]
- ๋
ธ๋ C์ ์ธ์ ํ ๋
ธ๋ ์ค ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋๋ฅผ ์ฐพ์ต๋๋ค. ์ธ์ ํ ๋
ธ๋๋ค์ A, F, I์
๋๋ค. ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๋
ธ๋ A๋ฅผ ์ ์ธํ๊ณ ๋
ธ๋ F๋ก ์ด๋ํฉ๋๋ค.
- ๋ฐฉ๋ฌธํ ๋ ธ๋: [A, B, D, E, C, F]
- ๋
ธ๋ F์ ์ธ์ ํ ๋
ธ๋ ์ค ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋๋ฅผ ์ฐพ์ต๋๋ค. ์ธ์ ํ ๋
ธ๋๋ค์ C์ G์
๋๋ค. ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๋
ธ๋ C๋ฅผ ์ ์ธํ๊ณ ๋
ธ๋ G๋ก ์ด๋ํฉ๋๋ค.
- ๋ฐฉ๋ฌธํ ๋ ธ๋: [A, B, D, E, C, F, G]
- ๋
ธ๋ G์ ์ธ์ ํ ๋
ธ๋ ์ค ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋๋ฅผ ์ฐพ์ต๋๋ค. ์ธ์ ํ ๋
ธ๋๋ค์ F, H, I์
๋๋ค. ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๋
ธ๋ F๋ฅผ ์ ์ธํ๊ณ ๋
ธ๋ H๋ก ์ด๋ํฉ๋๋ค.
- ๋ฐฉ๋ฌธํ ๋ ธ๋: [A, B, D, E, C, F, G, H]
- ๋ ธ๋ H์ ์ธ์ ํ ๋ ธ๋ ์ค ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ฅผ ์ฐพ์ต๋๋ค. ์ธ์ ํ ๋ ธ๋๋ G๋ฟ์ด๋ฉฐ ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์ํ์ ๋๋ค. ์ด์ ๋ ธ๋์ธ G๋ก ๋์๊ฐ๋๋ค.
- ๋
ธ๋ G์์ ์ธ์ ํ ๋
ธ๋ ์ค ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋๋ฅผ ์ฐพ์ต๋๋ค. ์ด์ ์ ํ์ธํ ๋
ธ๋ F์ H๋ฅผ ์ ์ธํ๊ณ ๋
ธ๋ I๋ก ์ด๋ํฉ๋๋ค.
- ๋ฐฉ๋ฌธํ ๋ ธ๋: [A, B, D, E, C, F, G, H, I]
- ๋ ธ๋ I์ ์ธ์ ํ ๋ ธ๋ ์ค ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ฅผ ์ฐพ์ต๋๋ค. ์ธ์ ํ ๋ ธ๋๋ค์ G์ C์ด์ง๋ง ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์ํ์ ๋๋ค. ์ด์ ๋ ธ๋์ธ G๋ก ๋์๊ฐ๋๋ค.
- ๋ ธ๋ G์์ ์ธ์ ํ ๋ ธ๋ ์ค ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ฅผ ์ฐพ์ต๋๋ค. ์ด๋ฏธ ํ์ธํ ๋ ธ๋๋ค F, H, I๋ฅผ ์ ์ธํ๊ณ ๋ค๋ฅธ ๋ ธ๋๊ฐ ์์ผ๋ฏ๋ก, ๋ ์ด์ ๋ฐฉ๋ฌธํ ๋ ธ๋๊ฐ ์์ต๋๋ค. ํ์์ ์ข ๋ฃํฉ๋๋ค.
๋ฐฉ๋ฌธ ์์๋ฅผ ์ซ์๋ก ํ๊ธฐํ์ฌ ์๋์ ๊ฐ์ด ๋ค์ Graph๋ฅผ ๊ทธ๋ ค๋ณด์์ต๋๋ค.
flowchart LR
1((1))
2((2))
3((3))
4((4))
5((5))
6((6))
7((7))
8((8))
9((9))
1---2
2---3
2---4
3---4
1---5
5---6
6---7
7---8
7---9
9---5
DFS๋ฅผ ์ํํ๋ javascript ์ฝ๋๋ฅผ ์์ฑํ์์ต๋๋ค.
const graph = {
A: ['B', 'C'],
B: ['A', 'D', 'E'],
C: ['A', 'F', 'I'],
D: ['B', 'E'],
E: ['B', 'D'],
F: ['C', 'G'],
G: ['F', 'H', 'I'],
H: ['G'],
I: ['G', 'C']
};
function dfs(graph, startNode) {
function explore(node, visited) {
if (visited.has(node)) {
return visited;
}
const newVisited = new Set(visited);
newVisited.add(node);
const neighbors = graph[node];
return neighbors.reduce((acc, neighbor) => explore(neighbor, acc), newVisited);
}
const visited = explore(startNode, new Set());
return Array.from(visited);
}
const visitedOrder = dfs(graph, 'A');
console.log(visitedOrder);
/** ['A', 'B', 'D', 'E', 'C', 'F', 'G', 'H', 'I'] */