그래프 탐색을 위한 알고리즘이다.
너비 우선 탐색(Breadth First Search): 정점들과 같은 레벨에 있는 노드들(형제 노드들)을 먼저 탐색하는 방식
방문을 마친 노드들은 큐1에 , 방문을 해야하는 노드들은 큐2에 저장해둔다. 만약 방문해야하는 노드가 큐1에 이미 존재한다면 건너 뛰고 다음 노드로 넘어간다.
const graph = {
A: ['B', 'C'],
B: ['A', 'D'],
C: ['A', 'G', 'H', 'I'],
D: ['B', 'E', 'F'],
E: ['D'],
F: ['D'],
G: ['C'],
H: ['C'],
I: ['C', 'J'],
J: ['I']
};
const bfs = (graph, startNode) => {
let visited = []; // 방문을 마친 노드들
let needVisit = []; // 방문해야할 노드들
needVisit.push(startNode); // 노드 탐색 시작
while (needVisit.length !== 0) { // 방문해야할 노드가 남아있다면
const node = needVisit.shift(); // queue이기 때문에 선입선출의 원칙을 지켜준다.
if (!visited.includes(node)) { // 해당 노드가 방문된 적 없다면
visited.push(node); // 큐에 삽입
needVisit = [...needVisit, ...graph[node]]; 새롭게 방문해야 할 노드를 큐에 삽입해준다.
}
}
return visited;
};
console.log(bfs(graph, "A"));
["A", "B", "C", "D", "G", "H", "I", "E", "F", "J"]
코플릿에서 BFS문제가 있어서 BFS가 뭔지부터 시작해 공부했다...수박 겉핥기 식이긴 한데 공부했더니 풀리긴 했다. 근데 이제 소요시간을 2시간 40분정도 곁들인.
많이 어렵다. 많이 어려운만큼 많이 공부해야해.