์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ์˜ 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
    // (ํƒ์ƒ‰ ์ˆœ์„œ๋Š” ์ด์›ƒ์˜ ์ถ”๊ฐ€ ์ˆœ์„œ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Œ)

     

     

    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€