그래프 탐색 알고리즘은 DFS (깊이 우선 탐색) BFS (너비 우선 탐색) 두가지 종류로 나눌 수 있다.
두가지 알고리즘에 대해 알아보고 해당 알고리즘을 javascript 언어로 구현해보도록 하겠다.

- 시작 정점을 1로 설정
- 1번 탐색시작. 1번과 연결되어있고 방문 안한 정점을 찾음 (=2번) 2번으로 이동함.
- 2번 탐색시작. 2번과 연결되어있고 방문 안한 정점을 찾음 (=3번) 3번으로 이동함.
- 3번 탐색시작. 3번과 연결되어있고 방문 안한 정점을 찾음 (=4번) 4번으로 이동함.
- 4번 탐색시작. 4번과 연결되어있는 방문 안한 정점을 찾음 (=존재하지않음) 다시 3번으로 올라감.
- 3번 탐색시작. 3번과 연결되어있고 방문 안한 정점을 찾음 (=존재하지않음) 2번으로 올라감.
- 2번 탐색시작. 2번과 연결되어있고 방문 안한 정점을 찾음 (=존재하지않음) 1번으로 올라감.
- 1번 탐색시작. 1번과 연결되어있고 방문 안한 정점을 찾음 (=5번) 5번으로 이동함.
해당 과정을 방문 안한 곳이 없을때 까지 반복한다.
- 1번으로 시작. 1번에서 갈 수 있는 곳을 (=2, 5, 9) 큐에 넣는다.
Queue : 2, 5, 9- 큐에 가장 먼저 있는 것을 뽑음. (=2) 2를 뽑아내고 2번에서 갈 수 있는 곳을 (=3) 큐에 넣는다.
Queue : 3, 5, 9- 큐에 가장 먼저 있는 것을 뽑음. (=3) 3을 뽑아내고 3번에서 갈 수 있는 곳을 (=4) 큐에 넣는다.
Queue : 4, 5, 9- 위 과정을 큐가 빌 때 까지 반복한다.
위와같은 방법으로 Stack을 활용해서 재귀함수를 쓰지 않고 구현이 가능하다.
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']
};
// graph 자료구조와 startNode를 입력
const DFS = (graph, startNode) => {
const visited = []; // 탐색을 마친 노드들
let needVisit = []; // 탐색해야할 노드들
needVisit.push(startNode); // 노드 탐색 시작
while (needVisit.length !== 0) { // 탐색해야할 노드가 남아있다면
const node = needVisit.shift(); // queue이기 때문에 선입선출, shift()를 사용한다.
if (!visited.includes(node)) { // 해당 노드가 탐색된 적 없다면
visited.push(node);
needVisit = [...graph[node], ...needVisit];
}
}
return visited;
};

- 처음에 1번으로 시작한다. 큐에 1을 넣는다.
Queue : 1- 큐에 가장 앞에 있는 것을 뽑는다. (=1) 1번과 연결되어있는 정점을 (=2, 3, 4) 큐에 넣는다.
Queue : 2, 3, 4- 큐에 가장 앞에 있는 것을 뽑는다. (=2) 2번과 연결되어있는 정점을 (=5) 큐에 넣는다.
Queue : 3, 4, 5- 큐에 가장 앞에 있는 것을 뽑는다. (=3) 3번과 연결되어있는 정점을 (=6, 7) 큐에 넣는다.
Queue : 4, 5, 6, 7
해당 과정을 방문 안한 곳이 없을때 까지 반복한다.
Stack을 활용하여 재귀함수를 쓰지않고 구현이 가능하다.
// graph 자료구조와 startNode를 입력
const BFS = (graph, startNode) => {
let visited = []; // 탐색을 마친 노드들
let needVisit = []; // 탐색해야할 노드들
needVisit.push(startNode); // 노드 탐색 시작
while (needVisit.length !== 0) { // 탐색해야할 노드가 남아있다면
const node = needVisit.shift(); // 가장 오래 남아있던 정점을 뽑아냄.
if (!visited.includes(node)) { // 해당 노드 방문이 처음이라면,
visited.push(node);
needVisit = [...needVisit, ...graph[node]];
}
}
return visited;
};
BFS는 기본적인 메모리가 필요하지만, 가지고 있는 메모리를 효율적으로 관리할 수 있고, DFS는 전체적으로 적게 들지만 예상치 못한 값을 만나게 되면 메모리가 터질 수 있다.
DFS는 경로의 특징을 구할 때, BFS는 최단거리를 구할 때 ,,