μλ°μ€ν¬λ¦½νΈμμμ BFSμ DFS
1. BFS (Breadth-First Search)
BFSλ μμ λ
ΈλμμλΆν° κ°κΉμ΄ λ
ΈλλΆν° μ°¨λ‘λ‘ λ°©λ¬Ένλ μκ³ λ¦¬μ¦μ
λλ€.
λ³΄ν΅ ν(Queue, FIFO: First-In, First-Out)λ₯Ό μ¬μ©ν©λλ€.
μ΅λ¨ κ²½λ‘, λ 벨 μν λ±μ μ μ©ν©λλ€.
function bfsWithVisited(start, getNeighbors) {
const queue = [start];
const visited = new Set();
visited.add(start);
console.log("μ΄κΈ° visited:", Array.from(visited));
while (queue.length > 0) {
const current = queue.shift(); // νμμ κ°μ₯ μμ μμλ₯Ό κΊΌλ
console.log("νμ¬ μ²λ¦¬ λ
Έλ:", current);
// νμ¬ λ
Έλμ μ΄μλ€μ μν
for (const neighbor of getNeighbors(current)) {
if (!visited.has(neighbor)) {
visited.add(neighbor);
queue.push(neighbor);
console.log(`μλ‘κ² λ°©λ¬Έ: ${neighbor} -> visited:`, Array.from(visited));
}
}
}
return visited;
}
// μμ κ·Έλν (μΈμ 리μ€νΈ νν)
const graph = {
A: ['B', 'C'],
B: ['A', 'D', 'E'],
C: ['A', 'F'],
D: ['B'],
E: ['B', 'F'],
F: ['C', 'E']
};
// BFS μ€ν μμ
console.log("BFS λ°©λ¬Έ κ²°κ³Ό:");
bfsWithVisited('A', node => graph[node]);
// μμ BFS λ°©λ¬Έ μμ: A → B → C → D → E → F
μ΄κΈ° μνμμ μμ λ
Έλ Aλ₯Ό νμ visitedμ μΆκ°ν©λλ€.
νμμ νλμ© κΊΌλ΄λ©°, ν΄λΉ λ
Έλμ μ΄μ μ€ μμ§ λ°©λ¬Ένμ§ μμ λ
Έλλ₯Ό νμ μΆκ°ν©λλ€.
λ°©λ¬Έ μν(visited)λ SetμΌλ‘ κ΄λ¦¬νμ¬ μ€λ³΅ λ°©λ¬Έμ λ§μ΅λλ€.
2. DFS (Depth-First Search)
DFSλ ν κ²½λ‘λ₯Ό κ°λ₯ν κΉκ² νμν ν, λ μ΄μ μ§νν μ μμΌλ©΄ λ°±νΈλνΉνμ¬ λ€λ₯Έ κ²½λ‘λ₯Ό νμν©λλ€.
μ¬κ·λ μ€ν(Stack, LIFO: Last-In, First-Out)μ μ¬μ©νμ¬ κ΅¬νν μ μμ΅λλ€.
κ²½λ‘ νμ, λ°±νΈλνΉ, μ¬μ΄ν΄ κ°μ§ λ±μ μ μ©ν©λλ€.
2.1. μ¬κ· κΈ°λ° DFS : ν¨μ νΈμΆ μ€νμ μ¬μ©ν΄ κΉμ΄ μ°μ νμμ μμ°μ€λ½κ² ꡬνν©λλ€.
function dfsRecursiveWithVisited(node, getNeighbors, visited = new Set()) {
visited.add(node);
console.log("νμ¬ λ°©λ¬Έ λ
Έλ:", node, "-> visited:", Array.from(visited));
for (const neighbor of getNeighbors(node)) {
if (!visited.has(neighbor)) {
dfsRecursiveWithVisited(neighbor, getNeighbors, visited);
}
}
return visited;
}
// DFS μ€ν μμ (μ¬κ· λ°©μ)
console.log("DFS (μ¬κ·) λ°©λ¬Έ κ²°κ³Ό:");
dfsRecursiveWithVisited('A', node => graph[node]);
// μμ DFS λ°©λ¬Έ μμ (μμ): A → B → D → E → F → C
// (νμ μμλ getNeighbors ν¨μμ λ°ν μμμ λ°λΌ λ¬λΌμ§ μ μμ)
2.2. μ€ν κΈ°λ° DFS: λͺ μμ μΈ μ€νμ μ¬μ©νμ¬ νμ μ μΆ(LIFO) λ°©μμΌλ‘, λ§μ§λ§μ μΆκ°λ λ ΈλλΆν° μ²λ¦¬ν©λλ€.
function dfsStack(start, getNeighbors) {
const stack = [start];
const visited = new Set();
while (stack.length > 0) {
const current = stack.pop(); // μ€νμμ λ§μ§λ§ μμλ₯Ό κΊΌλ (LIFO)
if (!visited.has(current)) {
visited.add(current);
console.log("νμ¬ λ°©λ¬Έ λ
Έλ:", current, "-> visited:", Array.from(visited));
// μ΄μλ€μ μ€νμ μΆκ° (μμλ μ΄μ λ°°μ΄ μμμ λ°λΌ λ€λ₯Ό μ μμ)
for (const neighbor of getNeighbors(current)) {
if (!visited.has(neighbor)) {
stack.push(neighbor);
}
}
}
}
return visited;
}
// DFS μ€ν μμ (μ€ν λ°©μ)
console.log("DFS (μ€ν) λ°©λ¬Έ κ²°κ³Ό:");
dfsStack('A', node => graph[node]);
// μμ DFS λ°©λ¬Έ μμ (μμ): A → C → F → E → B → D
// (νμ μμλ μ΄μμ μΆκ° μμμ λ°λΌ λ¬λΌμ§ μ μμ)