
✅ 그래프 표현 방법 - 인접행렬 vs 인접리스트
let graph = Array.from(Array(N + 1), () => []);
arr.forEach((el) => {
let [from, to] = el;
graph[from].push(to);
graph[to].push(from);
});
graph.forEach((el) => {
el.sort((a, b) => a - b);
});
1. 정점을 인자로 받는 재귀 함수를 만듬
2. 정점을 방문 처리
3. 정점의 각 인접점에 대해 방문하지 않은 접점이면 재귀 함수 호출
let visitedDFS = Array(N + 1).fill(0);
visitedDFS[0] = 1;
let result = [];
function DFS(start) {
visitedDFS[start] = 1; // 시작할때 방문처리
result.push(start);
for (next of graph[start]) {
if (!visitedDFS[next]) {
DFS(next);
}
}
}
DFS(V);
console.log(`DFS : ${result}`); // [3,1,2,5,4]
1. 큐를 생성하고 시작 정점을 넣음
2. 시작 접점을 방문 처리
3. 큐에서 접점을 꺼내 방문하지 않으면 방문처리
4. 접점의 각 인접점에 대해 방문하지 않은 인접점을 큐에 넣음
5. 큐가 빌때까지 계속 반복
let visitedBFS = Array(N + 1).fill(0);
visitedBFS[0] = 1;
let result2 = [];
let queue = [V];
visitedBFS[V] = 1;
while (queue.length > 0) {
let cur = queue.shift();
result2.push(cur);
for (next of graph[cur]) {
if (!visitedBFS[next]) {
queue.push(next);
visitedBFS[next] = 1; // 인접노드을 찾을때 방문처리
}
}
}
console.log(`BFS : ${result2}`); // [3,1,4,2,5]
✅ Queue의 구현
class Node {
constructor(data) {
this.data = data;
this.next = null;
}
}
class Queue {
constructor() {
this.front = null;
this.rear = null;
this.size = 0;
}
isEmpty() {
return this.size === 0;
}
push(data) {
let node = new Node(data);
if (this.isEmpty()) {
this.front = node;
this.rear = node;
} else {
let cur = this.rear;
cur.next = node;
this.rear = node;
}
this.size++;
}
shift() {
if (this.isEmpty()) return;
let returnValue = this.front;
this.front = this.front.next;
this.size--;
return returnValue.data;
}
}