DFS는 '깊이 우선 탐색(Depth First Search)'이다.
DFS 알고리즘은 시작점에서 출발해 가능한 멀리까지 간 후에 다시 돌아와서 다른 방향을 탐험하는 방식이다.
미로에서 길을 찾는다고 생각할 때, 시작점에서 한 방향으로 계속 직진한다. 가능한 멀리까지 갈 수 있을 때까지 계속 가다가 더 이상 갈 수 없으면 다시 뒤로 돌아오고, 다른 방향으로 갈 길이 있는지 찾아본다. 이걸 계속 반복하면 결국 모든 길을 다 돌아다니면서 길을 찾을 수 있다.
1 -> 2 -> 4 -> 5 -> 3 -> 6 -> 7
function dfsUsingStack(graph, start) {
const stack = [start]; // 시작 노드를 스택에 넣음
const visited = []; // 방문한 노드를 기록하기 위한 Array
while (stack.length > 0) {
const current = stack.pop();
if (!visited.includes(current)) {
visited.push(current);
console.log(current);
graph[current].forEach(neighbor => {
if (!visited.includes(neighbor)) {
stack.push(neighbor);
}
});
}
}
}
// 그래프의 인접 리스트 표현
const graph = {
A: ['B', 'C'],
B: ['D', 'E'],
C: ['F'],
D: [],
E: ['F'],
F: []
};
dfsUsingStack(graph, 'A'); // 시작 노드 'A'에서 DFS 시작
function dfsUsingRecursion(graph, current, visited) {
visited.push(current);
console.log(current);
graph[current].forEach(neighbor => {
if (!visited.includes(neighbor)) {
dfsUsingRecursion(graph, neighbor, visited);
}
});
}
// 그래프의 인접 리스트 표현
const graph = {
A: ['B', 'C'],
B: ['D', 'E'],
C: ['F'],
D: [],
E: ['F'],
F: []
};
const visited = [];
dfsUsingRecursion(graph, 'A', visited); // 시작 노드 'A'에서 DFS 시작