DFS와 BFS를 파이썬으로만 풀어봤지, js로 바꾼 이후에 풀어본 적이 없다 !
저번에 풀었던 지식으로 대충 구현하면 되겠지라 생각하고 입문했는데, Queue가 없다는 소식에 두둥 ..
그래서 정리하면서 이해해보려 한다!
Queue가 없는 이상 BFS를 풀 수 있는 방법은 총 세 가지가 있었다. (내가 생각했을 때)
1번은 매 코테때마다 생각하면서 구현하는 게 힘들다고 판단.
2번은 시간초과 날 가능성이 너무 많다.
따라서 3번으로 컨벤션을 세우면서 풀어나갈 것이다 :D
visited는 중복이 되지 않으니 집합으로 만든다.
queue로 사용할 배열도 선언.
빠진 척 진행할 변수는 front 변수를 사용한다.
function bfs(graph, startNode) {
const visited = new Set();
const queue = [];
let front = 0;
queue.push(startNode);
visited.add(startNode);
// 큐가 비어있지 않는 동안
while (front < queue.length) {
const currentNode = queue[front++];
console.log(currentNode); // 현재 노드를 방문하거나 다른 작업 수행
const neighbors = graph[currentNode] || []; // 해당 노드의 이웃 노드들
for (const neighbor of neighbors) {
if (!visited.has(neighbor)) {
visited.add(neighbor);
queue.push(neighbor);
}
}
}
}
const graph = {
1: [3, 6],
3: [1, 5],
4: [6],
5: [3, 6],
6: [1, 4, 5],
};
bfs(graph, 1);
function dfs(graph, startNode) {
const visited = new Set();
const stack = [];
stack.push(startNode);
visited.add(startNode);
while (stack.length > 0) {
const currentNode = stack.pop();
console.log(currentNode);
const neighbors = graph[currentNode] || [];
for (const neighbor of neighbors) {
if (!visited.has(neighbor)) {
visited.add(neighbor);
stack.push(neighbor);
}
}
}
}
const graph = {
1: [2, 3],
2: [1, 4, 5],
3: [1],
4: [2],
5: [2],
};
dfs(graph, 1);
인접리스트를 2차원 배열로 만들기
const input = fs
.readFileSync(filePath)
.toString()
.trim()
.split('\n')
.slice(1)
.map((value) => value.split(' ').map(Number));