Skip to content

Latest commit

ย 

History

History
146 lines (120 loc) ยท 5.27 KB

File metadata and controls

146 lines (120 loc) ยท 5.27 KB

Depth-First Search Algorithm

Depth-First Search Algorithm(=DFS)์€ ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์œผ๋กœ์„œ, ์ž๋ฃŒ๊ตฌ์กฐ์ธ Graph๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

Grapgh

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
Loading

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ์„œ ํ‘œํ˜„ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

DFS๋Š” ์œ„ Graph๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ, ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ๊นŠ์ด๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ A๋กœ ํ•˜์—ฌ ์•„๋ž˜์— ํƒ์ƒ‰ ์ˆœ์„œ๋ฅผ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  1. ์‹œ์ž‘ ๋…ธ๋“œ A๋ฅผ ๋ฐฉ๋ฌธํ•˜๊ณ , ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ: [A]
  2. ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค ์ค‘ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ฅผ ์ฐพ์•„ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ A์™€ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค์€ B์™€ C์ž…๋‹ˆ๋‹ค. ๋…ธ๋“œ B๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ: [A, B]
  3. ๋…ธ๋“œ B์™€ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค ์ค‘ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค์€ A, D, E์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ A๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋…ธ๋“œ D๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ: [A, B, D]
  4. ๋…ธ๋“œ D์™€ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค ์ค‘ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค์€ B์™€ E์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ B๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋…ธ๋“œ E๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ: [A, B, D, E]
  5. ๋…ธ๋“œ E์™€ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค ์ค‘ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค์€ B์™€ D์ด์ง€๋งŒ ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ์ด์ „ ๋…ธ๋“œ์ธ D๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.
  6. ๋…ธ๋“œ D์—์„œ ๋‹ค์‹œ ์ธ์ ‘ํ•œ ๋…ธ๋“œ ์ค‘ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ด์ „์— ํ™•์ธํ•œ ๋…ธ๋“œ E๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋‹ค๋ฅธ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ, ๋” ์ด์ƒ ๋ฐฉ๋ฌธํ•  ๋…ธ๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด์ „ ๋…ธ๋“œ์ธ B๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.
  7. ๋…ธ๋“œ B์—์„œ ์ธ์ ‘ํ•œ ๋…ธ๋“œ ์ค‘ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ด์ „์— ํ™•์ธํ•œ ๋…ธ๋“œ D์™€ E๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋‹ค๋ฅธ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ, ๋” ์ด์ƒ ๋ฐฉ๋ฌธํ•  ๋…ธ๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด์ „ ๋…ธ๋“œ์ธ A๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.
  8. ๋…ธ๋“œ A์—์„œ ์ธ์ ‘ํ•œ ๋…ธ๋“œ ์ค‘ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ C๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ: [A, B, D, E, C]
  9. ๋…ธ๋“œ C์™€ ์ธ์ ‘ํ•œ ๋…ธ๋“œ ์ค‘ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค์€ A, F, I์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ A๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋…ธ๋“œ F๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ: [A, B, D, E, C, F]
  10. ๋…ธ๋“œ F์™€ ์ธ์ ‘ํ•œ ๋…ธ๋“œ ์ค‘ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค์€ C์™€ G์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ C๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋…ธ๋“œ G๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ: [A, B, D, E, C, F, G]
  11. ๋…ธ๋“œ G์™€ ์ธ์ ‘ํ•œ ๋…ธ๋“œ ์ค‘ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค์€ F, H, I์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ F๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋…ธ๋“œ H๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ: [A, B, D, E, C, F, G, H]
  12. ๋…ธ๋“œ H์™€ ์ธ์ ‘ํ•œ ๋…ธ๋“œ ์ค‘ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋Š” G๋ฟ์ด๋ฉฐ ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ์ด์ „ ๋…ธ๋“œ์ธ G๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.
  13. ๋…ธ๋“œ G์—์„œ ์ธ์ ‘ํ•œ ๋…ธ๋“œ ์ค‘ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ด์ „์— ํ™•์ธํ•œ ๋…ธ๋“œ F์™€ H๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋…ธ๋“œ I๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ: [A, B, D, E, C, F, G, H, I]
  14. ๋…ธ๋“œ I์™€ ์ธ์ ‘ํ•œ ๋…ธ๋“œ ์ค‘ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค์€ G์™€ C์ด์ง€๋งŒ ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ์ด์ „ ๋…ธ๋“œ์ธ G๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.
  15. ๋…ธ๋“œ 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
Loading

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'] */