DFS, BFS

1. DFS & BFS ๋ž€?

  • ํ•œ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•œ ํ›„, ๋‹ค์Œ ๋…ธ๋“œ๋กœ "๋๊นŒ์ง€" ๋“ค์–ด๊ฐ”๋‹ค๊ฐ€ , ๋” ์ด์ƒ ๊ฐˆ ๊ณณ์ด ์—†์œผ๋ฉด ๋˜๋Œ์•„์˜ค๋Š” ๋ฐฉ์‹์˜ ํƒ์ƒ‰

  • ์ฃผ๋กœ Stack ์ž๋ฃŒ๊ตฌ์กฐ ์‚ฌ์šฉ(ํ˜น์€ ์žฌ๊ท€)

  • ํ•œ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•œ ํ›„, ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ํ์— ๋„ฃ๊ณ , ํ์—์„œ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด๋ฉฐ ํƒ์ƒ‰

  • ์ตœ๋‹จ๊ฑฐ๋ฆฌ ํƒ์ƒ‰ ๋ฌธ์ œ ์— ์œ ๋ฆฌ

  • 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 ๋น„๊ต

ํ•ญ๋ชฉ
DFS
BFS

์ „๋žต

ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ๋๊นŒ์ง€ ํŒŒ๊ณ ๋“ฆ

๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ํƒ์ƒ‰

์ž๋ฃŒ๊ตฌ์กฐ

์Šคํƒ / ์žฌ๊ท€

ํ

๊ตฌํ˜„ ๋‚œ์ด๋„

์žฌ๊ท€๋ฉด ๊ฐ„๋‹จ, ๋ฐ˜๋ณต์€ ๋ณต์žก

๋ฐ˜๋ณต๋ฌธ๋งŒ์œผ๋กœ ๊ฐ€๋Šฅ

์‚ฌ์šฉ ์˜ˆ์‹œ

๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜ ํƒ์ƒ‰ (๋ฐฑํŠธ๋ž˜ํ‚น, ๋ฏธ๋กœ, ๊ทธ๋ž˜ํ”„ ์—ฐ๊ฒฐ ์š”์†Œ ํƒ์ƒ‰ ๋“ฑ)

์ตœ๋‹จ ๊ฑฐ๋ฆฌ, ๋ ˆ๋ฒจ ํƒ์ƒ‰ (์ตœ๋‹จ ๊ฒฝ๋กœ, ํผ์ง€๋Š” ๊ฒƒ ๋“ฑ)

์†๋„

๊นŠ์ด โ†’ ๋А๋ฆด ์ˆ˜ ์žˆ์Œ

๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ํƒ์ƒ‰ โ†’ ๋น ๋ฆ„

๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ

๊นŠ์ด๊ฐ€ ๊นŠ์œผ๋ฉด ์Šคํƒ ๋งŽ์Œ

ํ์— ๋งŽ์€ ๋…ธ๋“œ๊ฐ€ ๋“ค์–ด๊ฐ


5. ์‹ค์ œ ํ™œ์šฉ ์˜ˆ์‹œ

๋ฌธ์ œ ์œ ํ˜•
DFS
BFS

๋ฏธ๋กœ ์ฐพ๊ธฐ

โœ…

โœ… (์ตœ๋‹จ ๊ฑฐ๋ฆฌ ์ฐพ์„ ๋•Œ 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. ์ •๋ฆฌ

ํฌ์ธํŠธ
DFS
BFS

๊ตฌํ˜„๋ฒ•

์žฌ๊ท€ / Stack

Queue

์ „ํ˜•์  ํŒจํ„ด

๋ฐฑํŠธ๋ž˜ํ‚น, ์™„์ „ํƒ์ƒ‰

์ตœ๋‹จ๊ฑฐ๋ฆฌ, ๋ ˆ๋ฒจ์ˆœ ํƒ์ƒ‰

๋ฐฉ๋ฌธ์ˆœ์„œ

๊นŠ์ด ์šฐ์„ 

๋„ˆ๋น„ ์šฐ์„ 

ํŠธ๋ฆฌ ๊ตฌ์กฐ

ํ›„์œ„ ์ˆœํšŒ์™€ ์œ ์‚ฌ

๋ ˆ๋ฒจ ์ˆœํšŒ

Last updated

Was this helpful?