์• ์ฆ์˜ DFS์™€ BFS.. ์ดํ•ด์•ˆ ๋˜๋Š” ์ค„ ์•Œ์•˜๋Š”๋ฐ ๋์–ด์š”
 
๋ฅผ ๊ธฐ๋…ํ•˜๋ฉฐ DFS์™€ BFS์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” ์ฝ”๋“œ๋ฅผ ๋ณด๊ธฐ ๋ณด๋‹ค ๋จผ์ € ๋จธ๋ฆฌ๋กœ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ๋‚˜์ค‘์„ ์œ„ํ•ด์„œ ์ข‹๋”๋ผ๊ณ ์š”

์ฝ”๋“œ๋ฅผ ์™ธ์šฐ๊ธฐ ๋ณด๋‹ค๋Š” ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ์‘์šฉ ๋ฌธ์ œ ํ˜น์€ ์‹ค์ œ ๋ฌธ์ œ ์ƒํ™ฉ์„ ๋Œ€๋น„ํ•˜๊ธฐ์— ์ ํ•ฉํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค

๊ทธ๋Ÿผ ์‹œ์ž‘!


 
 
 



 
DFS๋Š” ์•ฝ์ž์ž…๋‹ˆ๋‹ค.

Depth-First Search์˜ ์•ฝ์ž์ž…๋‹ˆ๋‹ค.

 

'๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰'์ด๋ผ๊ณ  ํ•˜์ฃ 

 


DFS๋Š” ํ•œ ๊ฒฝ๋กœ๋ฅผ ๋๊นŒ์ง€ ํŒŒ๊ณ ๋“ค์–ด์„œ ํƒ์ƒ‰ํ•œ ๋‹ค์Œ, ๋” ์ด์ƒ ๊ฐˆ ๊ณณ์ด ์—†์œผ๋ฉด ๋’ค๋กœ ๋Œ์•„์™€์„œ ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
'๊นŠ์ด'๋ฅผ ์šฐ์„ ํ•ด์„œ ํƒ์ƒ‰ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค
 
 

๐Ÿ›  ๋™์ž‘ ๊ณผ์ •

  1. ์‹œ์ž‘ ๋…ธ๋“œ ๋ฐฉ๋ฌธ
    • ์ถœ๋ฐœ ์ง€์ ์—์„œ ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ(visited ํ‘œ์‹œ)ํ•ฉ๋‹ˆ๋‹ค.
  2. ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ค‘ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋กœ ์ด๋™
    • ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋“ค ์ค‘์—์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    • ์„ ํƒ๋œ ๋…ธ๋“œ๋กœ ์ด๋™ํ•ด์„œ ๋‹ค์‹œ ๊ฐ™์€ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.
  3. ๋” ์ด์ƒ ๊ฐˆ ๊ณณ์ด ์—†์œผ๋ฉด ๋’ค๋กœ(backtrack)
    • ํ˜„์žฌ ๋…ธ๋“œ์—์„œ ๋” ์ด์ƒ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋Š” ์ƒˆ๋กœ์šด ๋…ธ๋“œ๊ฐ€ ์—†๋‹ค๋ฉด,
      ์ด์ „ ๋‹จ๊ณ„(๋ฐ”๋กœ ์ „ ๋…ธ๋“œ)๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.
    • ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๊ฒฝ๋กœ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  4. ๋ชจ๋“  ๋…ธ๋“œ ๋ฐฉ๋ฌธํ•  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
    • ๋ชจ๋“  ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉด ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

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์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค!
๋ณต์Šต ๋ฐ˜๋ณต๋งŒ์ด ์‚ด ๊ธธ!




 
 

+ Recent posts