내가 보려고 씀
⭐ DFS (Depth-First Search)
깊이 우선 탐색
💡 개념
- 넓게(wide) 탐색하기 전에 깊게(deep) 탐색
- 모든 노드를 방문하고자 하는 경우에 이 방법을 선택
- BFS 보다 간단
- BFS에 비해 검색 속도 느림
💡 특징
- 재귀함수를 이용함, 재귀함수의 코드가 훨씬 짧음
- 재귀함수란? 자기 자신을 호출하는 순환 알고리즘
- 어떤 노드를 방문했었는지 여부를 반드시 검사 (검사하지 않으면 무한루프)
- 모든 경우의 수를 탐색하고자 하는 미로 문제 같은 경우 적합 -> 미로 : 최단 경로X, 탈출 경로O
💡 구현 방법
방법 : https://codingnojam.tistory.com/44
- 스택 : 방문하는 순서대로 정점을 스택에 쌓고, 방문이 끝나면 스택에서 pop
- 재귀함수 : 재귀 함수를 이용하는 것이 가장 보편적이고 짧은 코드를 작성
// 재귀(Recursion) 형태로 구현
// dfs, 재귀, 인접 행렬, i 정점부터 시작
// 원소 삽입 : push()
// 원소 조회 : peek()
// 원소 뺴냄 : pop()
public static void dfs(int i) {
visit[i] = true;
for(int j = 1; j < n + 1; j++) {
if(map[i][j] == 1 && visit[j] == false) {
dfs(j);
}
}
}
⭐ BFS (Breadth-First Search)
너비 우선 탐색
💡 개념
- 깊게(deep) 탐색하기 전에 넓게(wide) 탐색
- 루트 노드(혹은 다른 임의의 노드)에서 시작해서 인접한 노드를 먼저 탐색
💡 특징
- 재귀적으로 동작하지 않음
- 어떤 노드를 방문했었는지 여부를 반드시 검사 (검사하지 않으면 무한루프)
- 두 노드 사이의 최단 경로 혹은 임의의 경로를 찾고 싶을 때
💡 구현 방법
방법 : https://codingnojam.tistory.com/41?category=1015196
- 큐(Queue) : 방문한 노드들을 차례로 저장한 후 꺼낼 수 있는 자료 구조인 큐(Queue)를 사용
즉, 선입선출(FIFO) 원칙
// bfs, 큐 사용, 인접행렬, i 정점부터 시작
// 원소 삽입 : offer(), add()
// 빼낼 원소 조회 : peek()
// 원소 빼냄 : poll(), remove()
public static void bfs(int i) {
Queue<Integer> q = new LinkedList<>();
q.offer(i);
visit[i] = true;
while(!q.isEmpty()) {
int temp = q.poll();
for(int j = 1; j < n + 1; j++) {
if(map[temp][j] == 1 && visit[j] == false) {
q.offer(j);
visit[j] = true;
}
}
}
}
'알고리즘 > DFS & BFS' 카테고리의 다른 글
프로그래머스 - 무인도 여행 (자바) (0) | 2023.04.04 |
---|---|
백준 2573 - 빙산 (자바) (0) | 2023.03.01 |
[BFS] 프로그래머스 - 가장 먼 노드 (자바) (0) | 2023.02.06 |
[DFS] 백준 2468 - 안전 영역 (자바) (0) | 2023.01.10 |