DFS와 BFS 모두 그래프 탐색 알고리즘으로, 여러 개체들이 연결되어 있는 자료구조에서 특정 개체를 찾기 위한 알고리즘으로 이해 가능 !
대표적인 문제 유형으로:
1. 경로탐색 유형 (최단거리, 시간)
2. 네트워크 유형 (연결)
3. 조합 유형 (모든 조합 만들기)
특정 개체만 끝까지 파는 유형으로, 재귀함수가 가장 일반적
재귀를 타고 타고 타서 탈출 조건에 먼저 도달하고 다음 파라미터를 하나씩 바꿔가면서 정답을 찾아가는 방식.
시험에서 자주 등장하는 DFS 문제 유형은
여러 개체를 하나씩 파보면서 가는 유형으로 Queue나 LinkedList로 구현하는 것이 일반적
BFS는 턴을 돌면서
1. 가장 먼저 넣었던 것을 꺼내서
2. 연결된 점을 Queue에 넣고
3. Queue가 빌 때까지 반복
-> 순서가 보장되어야 하기 때문에 위의 자료구조를 사용할 수 밖에 없음.
시험에서 자주 등장하는 BFS 문제 유형은
보통 경로 찾기, 연결 요소, 플러드 필의 경우 BFS, DFS 둘 중 하나 잡고 풀어도 상관없음.
그럼에도 DFS를 추천하긴 함.
-> 동작 검증이 쉬움.
DFS의 경우 하나의 조합을 완성해서 정답과 비교하고, 또 다른 조합을 완성해서 정답과 비교해보기 때문에 정답을 비교하는 시점에서 기대한 대로 조합이 잘 나왔는지 확인이 쉬움.
BFS는 한 번에 여러 조합들을 한칸한칸 만들어보다보니 조합이 완성되어서, 정답을 비교하는 시점에 언제 어덯게 이렇게 만들어졌지, 어디서부터 틀렸지? 확인이 어려움.
다만, DFS는 한 놈만 패는 알고리즘이라 그 한 놈이 악질이면 시간이 초과될 수 있음 -> 수행 시간 관점에서 복불복.
물론 운이 좋으면 첫번째 조합이 최적의 답이 될 수 있으나, 최악의 경우 모든 조합을 만들어야 할 수도 있음.
하지만 BFS의 경우, 한 번씩 패고 가는 알고리즘이라 물론 초반엔 느려보일 수 있지만 하나의 정답을 찾으면 나머지 경우는 정답에서 제외 -> 시간복잡도가 낮음.