깊이 탐색(Depth-First Search)과 너비 탐색 (Breadth-First Search)
개념은 이거 보면 깔끔하쥬?
핵심은 이를 구현하기 위해선 DFS → 재귀, BFS → queue 이다.
보통 재귀가 더 느리지만 코딩하기 간편하고 짧다는 차이가 있다.
void dfs(...){
if(/* 정답을 탐색했을 경우 or 끝에 도달할 때 */){
answer = ...;
return;
}
dfs(...)
}
void solution(...){
dfs(...); // dfs 탐색 시작
}
여기서 TMI TIP 인수로 넘길 때 call by reference(&) 로 하는 것이 정석. 메모리, 속도에 영향있다.
탐색하면서 역시 경로를 기억해야하는 경우가 상당히 많다. 주어진 배열을 활용하여 메모리 아끼면서 기억해도 되지만 보통 visit 배열을 만든다.
if(...){
visit[i] = 1;
dfs(...);
visit[i] = 0;
}
요롷게 방문하고 다시 초기화 해주는 것이 중요!
queue에 트리 데이터를 담고 while(!queue.empty())
돌리면 된다.
기본적인 탐색 구조이다.
#include<queue>
void solution(...){
queue<string> q;
q.push("a");
while(!q.emtpy()){
string cur = q.front();
//visit[i] = 1;
q.pop();
for(/* 탐색 */)
if(...){
q.push(...);
}
}
}
q.front()
가 pop된다는 것만 햇갈리지 않으면 될듯.. (본인 경험담.. 아무생각없이 back())