그래프 혹은 트리에서 모든 노드를 한 번씩 탐색하기 위한 기본적인 방법
완전 탐색
을 수행하기 위해 사용할 수 있는 방법 중 하나큐
자료구조 사용스택
, BFS는 큐
사용class Queue {
constructor() {
this.items = {};
this.headIndex = 0;
this.tailIndex = 0;
}
enqueue(item) {
this.items[this.tailIndex] = item;
this.tailIndex++;
}
dequeue() {
const item = this.items[this.headIndex];
delete this.items[this.headIndex];
this.headIndex++;
return item;
}
peek() {
return this.items[this.headIndex];
}
getLength() {
return this.tailIndex - this.headIndex;
}
}
// 구현된 큐 라이브러리 사용
queue = new Queue();
// 삽입(5) - 삽입(2) - 삽입(3) -삽입(7)
// - 삭제() - 삽입(1) - 삽입(4) - 삭제()
queue.enqueue(5);
queue.enqueue(2);
queue.enqueue(3);
queue.enqueue(7);
queue.dequeue();
queue.enqueue(1);
queue.enqueue(4);
queue.dequeue();
// 먼저 들어온 순서대로 출력
while (queue.getLength() != 0) {
console.log(queue.dequeue());
}
[예시]
시작 노드 A를 큐에 넣고 방문 처리
큐에서 A를 꺼내어 인접한 노드 중에서 방문하지 않은 노드인 B, C, D 방문
큐에서 B를 꺼냈지만 인접한 노드 중에서 방문하지 않은 노드가 없으므로 무시
큐에서 C를 꺼내어 인접한 노드 중에서 방문하지 않은 노드인 E, F를 방문
큐에서 D를 꺼내어 인접한 노드 중에서 방문하지 않은 노드인 G를 방문
큐에서 E를 꺼내어 인접한 노드 중에서 방문하지 않은 노드인 H를 방문
큐에서 F를 꺼냈지만 인접한 노드 중에서 방문하지 않은 노드가 없으므로 무시
큐에서 G를 꺼냈지만 인접한 노드 중에서 방문하지 않은 노드가 없으므로 무시
큐에서 H를 꺼냈지만 인접한 노드 중에서 방문하지 않은 노드가 없으므로 무시
간선의 비용이 동일한 상황에서 [최단 거리]문제를 해결하는 경우
우선순위 큐
사용완전 탐색을 위해 사용한 DFS 솔루션이 메모리/시간 초과를 받아 BFS로 재시도하는 경우
→ DFS와 BFS 모두 그래프 탐색 목적으로 사용할 수 있으나, 구현이 익숙하다면 BFS 추천
// BFS 메서드 정의
function bfs(graph, start, visited) {
queue = new Queue();
queue.enqueue(start);
// 현재 노드를 방문 처리
visited[start] = true;
// 큐가 빌 때까지 반복
while (queue.getLength() != 0) {
// 큐에서 하나의 원소를 뽑아 출력하기
v = queue.dequeue();
console.log(v);
// 아직 방문하지 않은 인접한 원소들을 큐에 삽입
for (i of graph[v]) {
if (!visited[i]) {
queue.enqueue(i);
visited[i] = true;
}
}
}
}
graph = [[], [2, 3, 4], [1], [1, 5, 6], [1, 7], [3, 8], [3], [4], [5]];
visited = Array(9).fill(false);
bfs(graph, 1, visited);