알고리즘

알고리즘(JS) - BFS DFS

또롱또 2022. 6. 28. 09:06
728x90

  • BFS(너비우선탐색) 방식: A - B - C - D - G - H - I - E - F - J
    • 출발노드에서 목표노드까지 최고속으로 간다.
    • 노드가 깊이 있을수록 오래걸린다
    • 두개의 Queue를 사용한다
const graph = {
  A: ["B", "C"],
  B: ["A", "D"],
  C: ["A", "G", "H", "I"],
  D: ["B", "E", "F"],
  E: ["D"],
  F: ["D"],
  G: ["C"],
  H: ["C"],
  I: ["C", "J"],
  J: ["I"]
};

const BFS = (graph, startNode) => {
  const visited = []; // 탐색을 마친 노드들
  let needVisit = []; // 탐색해야할 노드들

  needVisit.push(startNode); // 노드 탐색 시작

  while (needVisit.length !== 0) { // 탐색해야할 노드가 남아있다면
    const node = needVisit.shift(); // queue이기 때문에 선입선출, shift()를 사용한다.
    if (!visited.includes(node)) { // 해당 노드가 탐색된 적 없다면
      visited.push(node); 
      needVisit = [...needVisit, ...graph[node]];
    }
  }
  return visited;
};

console.log(BFS(graph, "A"));
// ["A", "B", "C", "D", "G", "H", "I", "E", "F", "J"]
  • DFS(깊이우선탐색) 방식: A - B - D - E - F - C - G - H - I - J
    • 무조건 깊이있는 노드부터 들어간다.
    • 한개의 Queue와 Stack을 사용
const DFS = (graph, startNode) => {
  const visited = []; // 탐색을 마친 노드들
  let needVisit = []; // 탐색해야할 노드들

  // 내가 찾고자 하는 노드를 push 해준다
  needVisit.push(startNode);

  while (needVisit.length !== 0) {
    // 탐색해야할 노드가 남아있다면
    const node = needVisit.shift(); // queue이기 때문에 선입선출, shift()를 사용한다.
    if (!visited.includes(node)) {
      // 해당 노드가 탐색된 적 없다면
      visited.push(node);
      needVisit = [...graph[node], ...needVisit];
    }
  }
  return visited;
};

console.log(DFS(graph, "I"));

 

728x90

'알고리즘' 카테고리의 다른 글

[CodeWars] Count by X - 8Kyu  (0) 2024.11.30
[CodeWars] Build a square - 7Kyu  (0) 2024.11.30
알고리즘 에너그램  (0) 2022.06.28
백준 2839번 - 설탕 배달  (0) 2022.06.26
프로그래머스 Level 1 - 숫자 문자열과 영단어  (0) 2022.05.26