Algorithm 2023. 6. 13.

[์ด๋ก ] BFS์™€ DFS (javascript)

BFS (๋„“์ด ์šฐ์„  ์ˆœํšŒ)

BFS๋ž€?

BFS๋Š” Breadth-First-Search์˜ ์ค„์ž„๋ง์ž…๋‹ˆ๋‹ค.

ํŠธ๋ฆฌ๋ฅผ ์ˆœํšŒํ•  ๋•Œ ๊ฐ™์€ ๋ ˆ๋ฒจ์˜ ๋…ธ๋“œ(๋„“์ด)๋ฅผ ์šฐ์„ ํ•˜์—ฌ ์ˆœํšŒํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ ํ˜„์žฌ ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ๋ณด๋‹ค ํ˜•์ œ ๋…ธ๋“œ๋ฅผ ์šฐ์„ ํ•˜์—ฌ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠธ๋ฆฌ (๊ทธ๋ž˜ํ”„) ๊ฐ€ ์žˆ์„ ๋•Œ,

BFS๋ฅผ ์ด์šฉํ•œ ์ˆœํšŒ ์ˆœ์„œ๋Š” ํ•ด๋‹น ๊ทธ๋ฆผ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.


BFS ๊ตฌํ˜„ ๋กœ์ง

BFS์„ ๊ตฌํ˜„ํ•˜๊ธฐ์œ„ํ•œ ๋กœ์ง์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋“ค์„ ๊ธฐ์–ตํ•  ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•ด ์ค๋‹ˆ๋‹ค.
  2. ๋ฐฉ๋ฌธํ•ด์•ผ ํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ๊ธฐ์–ตํ•  ํ๋ฅผ ์ƒ์„ฑํ•ด ์ค๋‹ˆ๋‹ค.
  3. ๋ฐฉ๋ฌธํ•ด์•ผํ•˜๋Š” ๋…ธ๋“œ(= ํ์˜ ๊ธธ์ด)๊ฐ€ ์กด์žฌํ•˜๋Š” ํ•œ ํ์—์„œ ๋‹ค์Œ ๋ฐฉ๋ฌธํ•  ๋…ธ๋“œ๋ฅผ ๋ฝ‘์•„ ์ค๋‹ˆ๋‹ค.
  4. ๋ฝ‘์€ ๋…ธ๋“œ๊ฐ€ ์ด๋ฏธ ๋ฐฉ๋ฌธํ–ˆ๋˜ ๋…ธ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด, ํ•ด๋‹น ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ๋“ค์„ ํ์— ํ›„ ์ˆœ์œ„๋กœ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค.
  5. ๋ฐฉ๋ฌธํ•ด์•ผ ํ•˜๋Š” ๋…ธ๋“œ๊ฐ€ ์—†์–ด์งˆ ๋•Œ ๊นŒ์ง€ 3-4 ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•ด์ค๋‹ˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ DFS ๊ตฌํ˜„ํ•˜๊ธฐ

const BFS = (graph, firstNode) => {
  const visited = [];
  let needVisit = [];

  needVisit.push(firstNode);

  while (!!needVisit.length) {
    const node = needVisit.shift();
    if (!visited.includes(node)) {
      visited.push(node);
      needVisit = [...needVisit, ...graph[node]];
    }
  }

  return visited;
};


DFS (๊นŠ์ด ์šฐ์„  ์ˆœํšŒ)

DFS๋ž€?

DFS๋Š” Depth-First-Search์˜ ์ค„์ž„๋ง์ž…๋‹ˆ๋‹ค.

ํŠธ๋ฆฌ๋ฅผ ์ˆœํšŒํ•  ๋•Œ ๊นŠ์ด๋ฅผ ์šฐ์„ ํ•˜์—ฌ ์ˆœํšŒํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ ํ˜„์žฌ ๋…ธ๋“œ์˜ ํ˜•์ œ ๋…ธ๋“œ๋ณด๋‹ค ์ž์‹ ๋…ธ๋“œ๋ฅผ ์šฐ์„ ํ•˜์—ฌ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠธ๋ฆฌ (๊ทธ๋ž˜ํ”„) ๊ฐ€ ์žˆ์„ ๋•Œ,

DFS๋ฅผ ์ด์šฉํ•œ ์ˆœํšŒ ์ˆœ์„œ๋Š” ํ•ด๋‹น ๊ทธ๋ฆผ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.


DFS ๊ตฌํ˜„ ๋กœ์ง

DFS์„ ๊ตฌํ˜„ํ•˜๊ธฐ์œ„ํ•œ ๋กœ์ง์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋“ค์„ ๊ธฐ์–ตํ•  ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•ด ์ค๋‹ˆ๋‹ค.
  2. ๋ฐฉ๋ฌธํ•ด์•ผ ํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ๊ธฐ์–ตํ•  ํ๋ฅผ ์ƒ์„ฑํ•ด ์ค๋‹ˆ๋‹ค.
  3. ๋ฐฉ๋ฌธํ•ด์•ผํ•˜๋Š” ๋…ธ๋“œ(= ํ์˜ ๊ธธ์ด)๊ฐ€ ์กด์žฌํ•˜๋Š” ํ•œ ํ์—์„œ ๋‹ค์Œ ๋ฐฉ๋ฌธํ•  ๋…ธ๋“œ๋ฅผ ๋ฝ‘์•„ ์ค๋‹ˆ๋‹ค.
  4. ๋ฝ‘์€ ๋…ธ๋“œ๊ฐ€ ์ด๋ฏธ ๋ฐฉ๋ฌธํ–ˆ๋˜ ๋…ธ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด, ํ•ด๋‹น ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ๋“ค์„ ํ์— ์šฐ์„  ์ˆœ์œ„๋กœ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค.
  5. ๋ฐฉ๋ฌธํ•ด์•ผ ํ•˜๋Š” ๋…ธ๋“œ๊ฐ€ ์—†์–ด์งˆ ๋•Œ ๊นŒ์ง€ 3-4 ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•ด์ค๋‹ˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ DFS ๊ตฌํ˜„ํ•˜๊ธฐ

const DFS = (graph, firstNode) => {
  const visited = [];
  let needVisit = [];

  needVisit.push(firstNode);

  while (!!needVisit.length) {
    const node = needVisit.shift();
    if (!visited.includes(node)) {
      visited.push(node);
      needVisit = [...graph[node], ...needVisit];
    }
  }

  return visited;
};