[백준] 1260번 DFS와BFS
2020년 07월 17일, 10:30
DFS와 BFS
문제 설명
그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다.
입력
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 > 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.
출력
첫째 줄에 DFS를 수행한 결과를, 그 다음 줄에는 BFS를 수행한 결과를 출력한다. V부터 방문된 점을 순서대로 출력하면 된다.
문제 풀이
- excuteDFS
- 방문 확인을 위해 visited배열 선언(+1을 해줘서 정점과 배열 인덱스를 맞춰서 사용.)
- dfs는 스택을 사용해서 구현.
- 방문안한 정점이라면 dfs에 push.
- startEdge를 방문했다고 바꿔줌.
- edges를 살펴보면서, 양방향이니까 edge[0],edge[1]에서 연결된 정점을 찾음.
- 번호가 작은 순서기 때문에 정렬(내림차).
- stack에 다시 넣어줌.
- excuteBFS
- 위의 과정에서 pop() 대신 shift()를 사용, 정렬은 오름차순.
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
// const input = fs.readFileSync("./stdin").toString().trim().split("\n");
const [vertexsLength, _, START] = input[0]
.trim()
.split(" ")
.map(element => Number(element));
const getEdges = input => {
const edges = [];
input.forEach(edge => {
const [start, end] = edge.split(" ").map(element => Number(element));
edges.push([start, end]);
});
return edges;
};
const excuteDFS = (edges, start, vertexsLength) => {
const visited = Array(vertexsLength + 1).fill(false);
const stack = [start];
const dfs = [];
while (stack.length !== 0) {
let startEdge = stack.pop();
if (!visited[startEdge]) dfs.push(startEdge);
visited[startEdge] = true;
let connectEdges = [];
edges.forEach(edge => {
if (edge[0] === startEdge && !visited[edge[1]]) {
connectEdges.push(edge[1]);
} else if (edge[1] === startEdge && !visited[edge[0]]) {
connectEdges.push(edge[0]);
}
});
connectEdges.sort((a, b) => b - a);
stack.push(...connectEdges);
}
return dfs;
};
const excuteBFS = (edges, start, vertexsLength) => {
const visited = Array(vertexsLength + 1).fill(false);
const queue = [start];
const bfs = [];
while (queue.length !== 0) {
let startEdge = queue.shift();
if (!visited[startEdge]) bfs.push(startEdge);
visited[startEdge] = true;
let connectEdges = [];
edges.forEach(edge => {
if (edge[0] === startEdge && !visited[edge[1]]) {
connectEdges.push(edge[1]);
} else if (edge[1] === startEdge && !visited[edge[0]]) {
connectEdges.push(edge[0]);
}
});
connectEdges.sort((a, b) => a - b);
queue.push(...connectEdges);
}
return bfs;
};
const print = result => {
let resultString = "";
result.forEach(element => {
resultString += `${element} `;
});
console.log(resultString);
};
const edges = getEdges(input.slice(1, input.length));
const resultDFS = excuteDFS(edges, START, vertexsLength);
const resultBFS = excuteBFS(edges, START, vertexsLength);
print(resultDFS);
print(resultBFS);