[Node.js | JavaScript] 백준 1260 DFS와 BFS 코드
@corinthioniaOctober 7, 2022
문제
그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다.
입력
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.
출력
첫째 줄에 DFS를 수행한 결과를, 그 다음 줄에는 BFS를 수행한 결과를 출력한다. V부터 방문된 점을 순서대로 출력하면 된다.
Solution
DFS
- 그래프에서 깊은 부분을 우선적으로 탐색하는 알고리즘 (최대한 멀리 있는 노드를 우선 탐색)
- 재귀 함수를 이용하면 간결하게 구현할 수 있다.
- 주로 번호가 낮은 노드부터 처리하도록 요구한다.
- 스택 자료구조에 기초한다는 점에서 구현이 간단한데, 실제로는 스택을 사용하지 않아도 되며, 데이터가 N개인 경우 O(N) 의 시간이 소요된다.
BFS
- O(N)
- 가까운 노드부터 탐색하는 알고리즘
- 실제 수행 시간은 DFS보다 좋다.
- 큐 자료구조에 기초한다는 점에서 구현이 간단하다.
코드
const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
const [n, m, v] = input[0].split(' ').map(Number);
const graph = Array.from(Array(n + 1), () => new Array(n + 1).fill(0));
// 연결된 정점 입력
for (let i = 1; i <= m; i++) {
let [a, b] = input[i].split(' ').map(Number);
graph[a][b] = 1;
graph[b][a] = 1;
}
const d_visited = new Array(n + 1).fill(false);
const d_answer = [];
function DFS(v) {
d_visited[v] = true;
d_answer.push(v);
for (let i = 1; i < graph.length; i++) {
if (graph[v][i] === 1 && d_visited[i] === false) {
DFS(i);
}
}
}
const b_visited = new Array(n + 1).fill(false);
const b_answer = [];
function BFS(v) {
const queue = [];
b_visited[v] = true;
b_answer.push(v);
queue.push(v);
while (queue.length !== 0) {
let dequeue = queue.shift();
for (let i = 1; i < graph.length; i++) {
if (graph[dequeue][i] === 1 && b_visited[i] === false) {
b_visited[i] = true;
queue.push(i);
b_answer.push(i);
}
}
}
}
DFS(v);
BFS(v);
console.log(d_answer.join(' '));
console.log(b_answer.join(' '));
← 이전 글[Node.js | JavaScript] 백준 11399 ATM 코드
다음 글 →[Node.js | JavaScript] 백준 2606 바이러스 코드