본문 바로가기
algorithm

JS로 BFS, DFS 구현

by HomieKim 2023. 7. 19.

위 와 같은 그래프를 탐색하는 알고리즘은 크게 DFS(깊이 우선 탐색), BFS(너비 우선 탐색)으로 나뉩 니다.

위 그림과 같은 그래프를 탐색하는 알고리즘을 js로 구현해 보려 합니다.

 

 BFS

  • 위 그림과 같이 너비를 우선으로 탐색 => 현재 정점에가 같은 deps에 있는 노드들은 먼저 방문한다는 뜻
  • 탐색 중인 현재 노드에서 인접한 노드를 먼저 방문
  • 최단 거리를 찾을 때 주로 사용
  • 자료구조 queue를 사용하여 구현

 DFS

  • 방문할 수 있는 최대 deps를 우선적으로 방문
  • 루트 노드에서 시작해서 해당 그래프의 최대 deps 까지 탐색, 더이상 탐색할 수 없다면 되돌아가 다시 최대 deps로 방문
  • stack 혹은 재귀 함수로 구현 가능

 code

const graph = {
  A: ["B", "D"],
  B: ["A", "E", "F"],
  D: ["A", "I", "J"],
  E: ["B"],
  F: ["B"],
  I: ["D"],
  J: ["D"],
};

const printBFS = [];
const printDFS = [];
const printRecursiveDFS = [];

// queue 사용
function BFS(graph, start) {
  const visited = [];
  const queue = [start];

  visited.push(start);

  while (queue.length > 0) {
    const node = queue.shift();
    printBFS.push(node);

    for (const adjNode of graph[node]) {
      if (!visited.includes(adjNode)) {
        visited.push(adjNode);
        queue.push(adjNode);
      }
    }
  }
}

// stack 사용
function DFS(graph, start) {
  const visited = [];
  const stack = [start];

  while (stack.length > 0) {
    const node = stack.pop();

    if (!visited.includes(node)) {
      visited.push(node);
      printDFS.push(node);
      for (const adjNode of graph[node]) {
        stack.push(adjNode);
      }
    }
  }
}

// 재귀함수 사용
function RecursiveDFS(graph, start, visited)  {
  visited.push(start);
  printRecursiveDFS.push(start);

  for (const adjNode of graph[start]) {
    if (!visited.includes(adjNode)) {
      RecursiveDFS(graph, adjNode, visited);
    }
  }
};

BFS(graph, "A");
console.log("BFS : ", printBFS.join(" "));
DFS(graph, "A");
console.log("DFS : ", printDFS.join(" "));
RecursiveDFS(graph, "A", []);
console.log('DFS Recursive : ',printRecursiveDFS.join(" "));

출력

 

'algorithm' 카테고리의 다른 글

[JS] 프로그래머스 점찍기  (0) 2023.07.30
최장 공통 부분 수열(LCS)  (0) 2022.02.15
퀵 소트(Quick Sort)  (0) 2021.10.06
병합정렬 (Merge Sort)  (0) 2021.09.24
기수정렬 (Radix sort)  (0) 2021.09.15

댓글