본문 바로가기
코딩테스트 연습

[백준] 1260번 DFS와 BFS (JavaScript)

by eddypark 2024. 1. 16.

https://www.acmicpc.net/problem/1260

 

1260번: DFS와 BFS

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사

www.acmicpc.net

// const input = require("fs").readFileSync("/dev/stdin").toString().trim().split("\n");
let input = require("fs")
  .readFileSync("example.txt")
  .toString()
  .trim()
  .split("\r\n");

function bfs(graph, startNode) {
  const visited = [];
  let needVisit = [];

  needVisit.push(startNode);
  while (needVisit.length !== 0) {
    const node = needVisit.shift(); // 큐 구조로 shift 사용
    if (!visited.includes(node)) {
      visited.push(node);
      let nodes = graph[node];
      needVisit = [...needVisit, ...nodes.sort((a, b) => a - b)]; // 큐 구조 때문에 오름차 순
    }
  }
  return visited;
}

function dfs(graph, startNode) {
  const visited = [];
  let needVisit = [];

  needVisit.push(startNode);
  while (needVisit.length !== 0) {
    const node = needVisit.pop(); // 스택 구조로 pop사용
    if (!visited.includes(node)) {
      visited.push(node);
      let nodes = graph[node];
      needVisit = [...needVisit, ...nodes.sort((a, b) => b - a)]; // 스택때문에 내림차 순
    }
  }
  return visited;
}

let [n, m, v] = input.shift().split(" ").map(Number);
let graph = [...Array(n + 1)].map((e) => []);

for (let i = 0; i < m; i++) {
  let [start, end] = input[i].split(" ").map(Number);
  graph[start].push(end);
  graph[end].push(start);
}
console.log(dfs(graph, v).join(" "));
console.log(bfs(graph, v).join(" "));

 

간단한 인접 리스트 방식으로 푼 dfs와 bfs이다. 가장 기초이니 잘 알아둘것

'코딩테스트 연습' 카테고리의 다른 글

[백준] 1929번 소수 구하기 (JavaScript)  (0) 2024.01.16
[백준] 1463번 1로 만들기 (JavaScript)  (0) 2024.01.16
[Softeer] 회의실 예약  (0) 2023.09.21
[Softeer] 금고털이  (0) 2023.09.20
[Softeer] 8단 변속기  (0) 2023.09.19