[백준] 2606. 바이러스 (자바스크립트/javascript/node.js/BFS/DFS/너비 우선 탐색 / 깊이 우선 탐색 / 알고리즘 / 코딩테스트)
2021. 5. 28. 12:50ㆍFront-end/알고리즘
728x90
반응형
문제를 풀기 위한 아이디어
1번 컴퓨터부터 시작하여 경로를 거치게 되는 정점을 모두 구하는 문제이다.
DFS 방법으로 풀어도 되고 BFS 방법으로 풀어도 무방하다.
예제의 경우 DFS로 풀면 1→2→3→5→6 순으로 거치게 되고, BFS로 풀면 1→2→5→3→6 으로 거치게 된다.
내가 작성한 코드
1. DFS로 푼 방법
let fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().split("\n");
const vertexNumber = Number(input[0]); // 컴퓨터의 수 : 7
const edgeNumber = Number(input[1]); // 간선의 수 : 6
input.shift();
input.shift();
class UndirectedGraph {
constructor() {
this.edges = {};
this.DFSArray = [];
}
// 정점 추가하기
addVertex(vertex) {
this.edges[vertex] = {};
}
// 간선 추가하기
addEdges(vertex1, vertex2) {
this.edges[vertex1][vertex2] = true;
this.edges[vertex2][vertex1] = true;
}
// DFS
traverseDFS(vertex) {
const visited = {};
this._traverseDFS(vertex, visited);
return this.DFSArray;
}
_traverseDFS(vertex, visited) {
visited[vertex] = true;
this.DFSArray.push(vertex);
for (let adjacentVertex in this.edges[vertex]) {
if (!visited[adjacentVertex]) {
this._traverseDFS(adjacentVertex, visited);
}
}
}
}
const undirectedGraph = new UndirectedGraph();
for (let i = 1; i <= vertexNumber; i++) {
undirectedGraph.addVertex(Number(i));
}
for (let j = 0; j < edgeNumber; j++) {
input[j] = input[j].split(" ");
undirectedGraph.addEdges(Number(input[j][0]), Number(input[j][1]));
}
const answer = undirectedGraph.traverseDFS(1).length - 1;
console.log(answer);
2. BFS로 푼 방법
let fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().split("\n");
const vertexNumber = Number(input[0]); // 컴퓨터의 수 : 7
const edgeNumber = Number(input[1]); // 간선의 수 : 6
input.shift();
input.shift();
class UndirectedGraph {
constructor() {
this.edges = {};
this.BFSArray = [];
}
// 정점 추가하기
addVertex(vertex) {
this.edges[vertex] = {};
}
// 간선 추가하기
addEdges(vertex1, vertex2) {
this.edges[vertex1][vertex2] = true;
this.edges[vertex2][vertex1] = true;
}
// BFS
traverseBFS(vertex) {
const queue = [];
const visited = {};
queue.push(vertex);
while (queue.length) {
vertex = queue.shift();
if (!visited[vertex]) {
visited[vertex] = true;
this.BFSArray.push(vertex);
for (let adjacentVertex in this.edges[vertex]) {
queue.push(adjacentVertex);
}
}
}
return this.BFSArray;
}
}
const undirectedGraph = new UndirectedGraph();
for (let i = 1; i <= vertexNumber; i++) {
undirectedGraph.addVertex(i);
}
for (let j = 0; j < edgeNumber; j++) {
input[j] = input[j].split(" ");
undirectedGraph.addEdges(Number(input[j][0]), Number(input[j][1]));
}
const answer = undirectedGraph.traverseBFS(1).length - 1;
console.log(answer);
728x90
반응형
'Front-end > 알고리즘' 카테고리의 다른 글
[백준] 2178. 미로 탐색 (자바스크립트/js/javascript/node.js/BFS/최단경로) (0) | 2021.05.31 |
---|---|
[백준] 2667. 단지번호붙이기 (자바스크립트/node.js/javascript/BFS/DFS/너비 우선 탐색/깊이 우선 탐색) (0) | 2021.05.29 |
[백준] 1931. 회의실 배정 (자바스크립트/js/javascript/node.js/정렬/그리디 알고리즘/탐욕적 알고리즘) (0) | 2021.05.17 |
[백준] 2108. 통계학 (자바스크립트/js/javascript/node.js) (0) | 2021.05.05 |
[알고리즘] 정렬 - 합병정렬(병합정렬, Merge Sort) (자바스크립트/javascript) (0) | 2021.05.05 |