[출처] Guru99.com
[출처] https://www.javatpoint.com/ai-uninformed-search-algorithms
💡 스택 & 큐
스택(stack)
- LIFO(last-In-First_out)
- 후입선출 구조, 데이터를 추가 할때마다 데이터 마지막에 추가되고, 삭제할 때 마지막에 추가된 데이터가 먼저 삭제
- 스택에서는 데이터 삽입(push)과 제거(pop)는 스택의 맨 위 한지점에 발생
- push() : 매개변수 그대로 배열의 마지막 추가한 후 늘어난 배열길이를 반환
- pop() : 배열의 마지막 데이터를 꺼내 반환, 배열의 길이는 1만큼 줄어듬
큐(Queue)
- FIFO(First-In-First-Out)
- 선입선출 구조, 목록 마지막에 추가하며, 목록 맨앞에서 데이터를 삭제
- 큐에서는 shift() 메서드 사용
- shift() : 배열의 첫 번째 데이터를 꺼내서 반환하며 배열 길이는 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', 'J'],
I: ['C'],
J: ['I']
};
const bfsFnc = (graph, startNode) => {
let resultNode = []; // 탐색이 끝난 노드
let searchNode = []; // 탐색이 필요한 노드
searchNode.push(startNode); //노드 탐색 시작
while(searchNode.length !== 0) { // 탐색 노드 체크
const node = searchNode.shift(); // Queue -> FIFO(First-In-First-Out)[선입선출]
if (!resultNode.includes(node)) {
// 탐색이 끝난 노드가 아니면 push
resultNode.push(node);
searchNode = [...searchNode, ...graph[node]];
}
}
return resultNode;
}
console.log(bfsFnc(graph , "A"));
// ["A", "B", "C", "D", "G", "H", "I", "E", "F", "J"]
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 dfsFuc = (graph, startNode) => {
let searchNodeStack = []; // 탐색 노드
let resultQueue = []; // 탐색이 끝난 노드
searchNodeStack.push(startNode);
while (searchNodeStack.length !== 0) {
// 탐색이 필요한 노드가 있는지 확인
const node = searchNodeStack.pop(); // Stack -> LIFO(Last-In-First-Out)[후입선출]
if (!resultQueue.includes(node)) {
// 탐색한적이 없는 노드 체크
resultQueue.push(node);
searchNodeStack = [...searchNodeStack, ...graph[node]];
}
}
return resultQueue;
};
console.log(dfsFuc(graph, "A"));
/// ["A", "C", "I", "J", "H", "G", "B", "D", "F", "E"]