DFS, BFS
1. DFS & BFS ๋?
DFS(Depth-First Search, ๊น์ด ์ฐ์ ํ์)
ํ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ํ, ๋ค์ ๋ ธ๋๋ก "๋๊น์ง" ๋ค์ด๊ฐ๋ค๊ฐ , ๋ ์ด์ ๊ฐ ๊ณณ์ด ์์ผ๋ฉด ๋๋์์ค๋ ๋ฐฉ์์ ํ์
์ฃผ๋ก Stack ์๋ฃ๊ตฌ์กฐ ์ฌ์ฉ(ํน์ ์ฌ๊ท)
BFS (Breadth-First Search, ๋๋น ์ฐ์ ํ์)
ํ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ํ, ์ธ์ ํ ๋ ธ๋๋ฅผ ๋ชจ๋ ํ์ ๋ฃ๊ณ , ํ์์ ํ๋์ฉ ๊บผ๋ด๋ฉฐ ํ์
์ต๋จ๊ฑฐ๋ฆฌ ํ์ ๋ฌธ์ ์ ์ ๋ฆฌ
Queue ์๋ฃ๊ตฌ์กฐ ์ฌ์ฉ
2. ๊ณตํต ๊ฐ๋
๊ทธ๋ํ ํ์ ์๊ณ ๋ฆฌ์ฆ ( ํธ๋ฆฌ๋ ๊ทธ๋ํ์ ์ผ์ข )
๋ฐฉ๋ฌธ ์ฒ๋ฆฌ ๊ฐ ์ค์ (๋ฌดํ ๋ฃจํ ๋ฐฉ์ง)
์ธ์ ๋ฆฌ์คํธ(
List<List<Integer>>
) ๋ ์ธ์ ํ๋ ฌ (int[][]
) ๋ก ๊ทธ๋ํ ํํ ๊ฐ๋ฅ
3. ์ฝ๋ ์์ (Java)
์์ ๊ทธ๋ํ(๋ฌด๋ฐฉํฅ, ์ฐ๊ฒฐ)
1 - 2
| |
3 - 4
์ธ์ ๋ฆฌ์คํธ ํํ
List<List<Integer>> graph = new ArrayList<>();
for(int i = 0; i <= 4; i++) {
graph.add(new ArrayList<>());
}
graph.get(1).addAll(List.of(2,3));
graph.get(2).addAll(List.of(1,4));
graph.get(3).addAll(List.of(1,4));
graph.get(4).addAll(List.of(2,3));
DFS (์ฌ๊ท)
boolean[] visited = new boolean[5];
void dfs(int node) {
visited[node] = true;
System.out.println(node + " ");
for(int next : graph.get(node)) {
if(!visited[next]) {
dfs(next);
}
}
}
ํธ์ถ :
dfs(1)
์ถ๋ ฅ :
1 2 4 3
๋๋1 3 4 2
(ํ์ ์์์ ๋ฐ๋ผ ๋ค๋ฆ)
BFS
boolean[] visited = new boolean[5];
void bfs(int start) {
Queue<Integer> queue = new LinkedList<>();
queue.offer(start);
visited[start] = true;
while(!queue.isEmptry()) {
int node = queue.poll();
System.out.println(node + " ");
for(int next : graph.get(node)) {
if(!visited[next]) {
visited[next] = true;
queue.offer(next);
}
}
}
}
ํธ์ถ :
bfs(1)
์ถ๋ ฅ :
1 2 3 4
4. DFS vs BFS ๋น๊ต
์ ๋ต
ํ ๋ฐฉํฅ์ผ๋ก ๋๊น์ง ํ๊ณ ๋ฆ
๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ํ์
์๋ฃ๊ตฌ์กฐ
์คํ / ์ฌ๊ท
ํ
๊ตฌํ ๋์ด๋
์ฌ๊ท๋ฉด ๊ฐ๋จ, ๋ฐ๋ณต์ ๋ณต์ก
๋ฐ๋ณต๋ฌธ๋ง์ผ๋ก ๊ฐ๋ฅ
์ฌ์ฉ ์์
๋ชจ๋ ๊ฒฝ์ฐ์ ์ ํ์ (๋ฐฑํธ๋ํน, ๋ฏธ๋ก, ๊ทธ๋ํ ์ฐ๊ฒฐ ์์ ํ์ ๋ฑ)
์ต๋จ ๊ฑฐ๋ฆฌ, ๋ ๋ฒจ ํ์ (์ต๋จ ๊ฒฝ๋ก, ํผ์ง๋ ๊ฒ ๋ฑ)
์๋
๊น์ด โ ๋๋ฆด ์ ์์
๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ํ์ โ ๋น ๋ฆ
๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ
๊น์ด๊ฐ ๊น์ผ๋ฉด ์คํ ๋ง์
ํ์ ๋ง์ ๋ ธ๋๊ฐ ๋ค์ด๊ฐ
5. ์ค์ ํ์ฉ ์์
๋ฏธ๋ก ์ฐพ๊ธฐ
โ
โ (์ต๋จ ๊ฑฐ๋ฆฌ ์ฐพ์ ๋ BFS๊ฐ ๋ ์ ํฉ)
์ฐ๊ฒฐ ์์ ๊ฐ์ ๊ตฌํ๊ธฐ
โ
โ
์ฌ์ดํด ํ์ง
โ
โ
์ฌ์ ๊ฐ์ ๊ตฌํ๊ธฐ (Flood Fill)
โ
โ
ํผ์ง๋ ๋ฌธ์ (๋ถ, ๋ฐ์ด๋ฌ์ค ๋ฑ)
โ
โ
์ต๋จ ๊ฑฐ๋ฆฌ ๊ตฌํ๊ธฐ
โ
โ
๋ฐฑํธ๋ํน (n-Queen, ์กฐํฉ)
โ
โ
6. ๊ทธ๋ํ ํํ ๋ฐฉ๋ฒ
์ธ์ ๋ฆฌ์คํธ(Sparse Graph ์ ์ ํฉ)
List<List<Integer>> graph = new ArrayList<>();
์ธ์ ํ๋ ฌ(Dense Graph ์ ์ ํฉ)
int[][] graph = new int[N+1][N+1];
7. ์์ฉ ์์
๋ฏธ๋ก ์ต๋จ ๊ฒฝ๋ก(BFS)
int[][] maze = {
{1,1,0,1},
{0,1,0,1},
{0,1,1,1},
{1,0,0,1}
};
int[][] dist = new int[4][4];
Queue<int[]> q = new LinkedList<>();
q.offer(new int[]{0, 0});
dist[0][0] = 1;
int[] dx = {-1,1,0,0}, dy = {0,0,-1,1};
while (!q.isEmpty()) {
int[] cur = q.poll();
int x = cur[0], y = cur[1];
for (int i = 0; i < 4; i++) {
int nx = x + dx[i], ny = y + dy[i];
if (nx < 0 || ny < 0 || nx >= 4 || ny >= 4) continue;
if (maze[nx][ny] == 0 || dist[nx][ny] != 0) continue;
dist[nx][ny] = dist[x][y] + 1;
q.offer(new int[]{nx, ny});
}
}
System.out.println(dist[3][3]); // ๋์ฐฉ์ง๊น์ง ์ต๋จ ๊ฑฐ๋ฆฌ
8. ์ ๋ฆฌ
๊ตฌํ๋ฒ
์ฌ๊ท / Stack
Queue
์ ํ์ ํจํด
๋ฐฑํธ๋ํน, ์์ ํ์
์ต๋จ๊ฑฐ๋ฆฌ, ๋ ๋ฒจ์ ํ์
๋ฐฉ๋ฌธ์์
๊น์ด ์ฐ์
๋๋น ์ฐ์
ํธ๋ฆฌ ๊ตฌ์กฐ
ํ์ ์ํ์ ์ ์ฌ
๋ ๋ฒจ ์ํ
Last updated
Was this helpful?