Jin's Library

DFS, BFS Template ๋ณธ๋ฌธ

Algorithm - Java

DFS, BFS Template

Linkin 2025. 10. 21. 10:15

 

๐Ÿงญ DFS / BFS ์ •๋ณต ์„ธํŠธ


๐Ÿงฉ 1๏ธโƒฃ DFS ์™„์ „ ์•”๊ธฐ์šฉ ๋ฒ„์ „

๐Ÿ“˜ ๊ธฐ๋ณธ ๊ทธ๋ž˜ํ”„ํ˜• (์žฌ๊ท€ DFS)

static void dfs(int node) {
    visited[node] = true;

    for (int next : graph[node]) {
        if (!visited[next]) {
            dfs(next);
        }
    }
}

ํŒจํ„ด ์•”๊ธฐ ํฌ์ธํŠธ

  • “๋ฐฉ๋ฌธํ•˜๊ณ  → ๋‹ค์Œ์œผ๋กœ ๊ฐ„๋‹ค”
  • ์žฌ๊ท€ํ•จ์ˆ˜ ์ข…๋ฃŒ์กฐ๊ฑด์€ ๋ณ„๋„ ํ•„์š” ์—†์Œ (์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ if๋กœ ๊ฑธ๋Ÿฌ์ง)
  • ์Šคํƒ์„ ์“ฐ๋Š” DFS๋Š” ๊ฑฐ์˜ ๋™์ผํ•˜์ง€๋งŒ ๋ช…์‹œ์ ์œผ๋กœ ์Šคํƒ๋งŒ ์”€

๐Ÿ“— 2์ฐจ์› ๋ฐฐ์—ดํ˜• (๋ฏธ๋กœ, ์„ฌ ๊ฐœ์ˆ˜, ์˜์—ญ ํƒ์ƒ‰ ๋“ฑ)

static void dfs(int x, int y) {
    visited[x][y] = true;

    for (int d = 0; d < 4; d++) {
        int nx = x + dx[d];
        int ny = y + dy[d];

        if (nx < 0 || ny < 0 || nx >= N || ny >= M) continue;
        if (!visited[nx][ny] && map[nx][ny] == 1) {
            dfs(nx, ny);
        }
    }
}

ํ•ต์‹ฌ

  • visited ๋จผ์ € ์ฒดํฌ
  • ๋ฒ”์œ„์ฒดํฌ → ๋ฐฉ๋ฌธ์ฒดํฌ → ์กฐ๊ฑดํ™•์ธ ์ˆœ์„œ
  • map[nx][ny] == 1 ๊ฐ™์€ ์กฐ๊ฑด์€ ๋ฌธ์ œ์— ๋”ฐ๋ผ ๋‹ค๋ฆ„

โš™๏ธ dx, dy ๊ธฐ๋ณธ ์„ธํŠธ (4๋ฐฉ / 8๋ฐฉ)

// 4๋ฐฉํ–ฅ (์ƒํ•˜์ขŒ์šฐ)
int[] dx = {-1, 1, 0, 0};
int[] dy = {0, 0, -1, 1};

// 8๋ฐฉํ–ฅ (๋Œ€๊ฐ์„  ํฌํ•จ)
int[] dx8 = {-1,-1,-1, 0, 0, 1, 1, 1};
int[] dy8 = {-1, 0, 1,-1, 1,-1, 0, 1};

๐Ÿš€ 2๏ธโƒฃ BFS ์™„์ „ ์•”๊ธฐ์šฉ ๋ฒ„์ „

๐Ÿ“˜ ๊ธฐ๋ณธ ๊ทธ๋ž˜ํ”„ํ˜• (ํ BFS)

Queue<Integer> q = new LinkedList<>();
q.add(start);
visited[start] = true;

while (!q.isEmpty()) {
    int cur = q.poll();

    for (int next : graph[cur]) {
        if (!visited[next]) {
            visited[next] = true;
            q.add(next);
        }
    }
}

ํŒจํ„ด ์•”๊ธฐ ํฌ์ธํŠธ

  • “ํ์— ๋„ฃ์„ ๋•Œ ๋ฐฉ๋ฌธ ์ฒดํฌ”
  • poll → ํƒ์ƒ‰ → add ๊ตฌ์กฐ
  • ๊ฑฐ๋ฆฌ๊ณ„์‚ฐ ์‹œ ๋ฐฐ์—ด ์ถ”๊ฐ€ (dist[next] = dist[cur] + 1)

๐Ÿ“— 2์ฐจ์› ๋ฐฐ์—ดํ˜• (๋ฏธ๋กœ ํƒ์ƒ‰, ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๋“ฑ)

Queue<int[]> q = new LinkedList<>();
q.add(new int[]{sx, sy});
visited[sx][sy] = true;

while (!q.isEmpty()) {
    int[] cur = q.poll();
    int x = cur[0];
    int y = cur[1];

    for (int d = 0; d < 4; d++) {
        int nx = x + dx[d];
        int ny = y + dy[d];

        if (nx < 0 || ny < 0 || nx >= N || ny >= M) continue;
        if (!visited[nx][ny] && map[nx][ny] == 1) {
            visited[nx][ny] = true;
            q.add(new int[]{nx, ny});
        }
    }
}

๐Ÿง  DFS vs BFS ๋น„๊ต ์š”์•ฝํ‘œ

ํ•ญ๋ชฉ DFS BFS

ํƒ์ƒ‰ ๊ตฌ์กฐ ์žฌ๊ท€ or ์Šคํƒ ํ
ํƒ์ƒ‰ ์ˆœ์„œ ํ•œ ๊ฒฝ๋กœ ๋๊นŒ์ง€ ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ
์ฃผ ์‚ฌ์šฉ ๋ชฉ์  ๊ฒฝ๋กœ ํƒ์ƒ‰, ๋ฐฑํŠธ๋ž˜ํ‚น ์ตœ๋‹จ๊ฑฐ๋ฆฌ ํƒ์ƒ‰
๋ฐฉ๋ฌธ ์ฒดํฌ ์‹œ์  ์žฌ๊ท€ ์ง„์ž… ์ง์ „ ํ์— ๋„ฃ์„ ๋•Œ
์‹œ๊ฐ„ ๋ณต์žก๋„ O(V + E) O(V + E)
์‚ฌ์šฉ ์˜ˆ์‹œ ์„ฌ์˜ ๊ฐœ์ˆ˜, ์—ฐ๊ฒฐ ์š”์†Œ ๋ฏธ๋กœ ํƒ์ƒ‰, ์ตœ์†Œ ๊ฑฐ๋ฆฌ

๐ŸŽฏ ๋ฌธ์ œ์œ ํ˜•๋ณ„ ์ถ”์ฒœ ํ…œํ”Œ๋ฆฟ ์„ ํƒํ‘œ

๋ฌธ์ œ ์œ ํ˜• ์˜ˆ์‹œ ๋ฌธ์ œ ์ถ”์ฒœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ค๋ช…

๋ฏธ๋กœ ํƒ์ƒ‰ 2178 BFS ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๊ตฌํ•˜๊ธฐ
๋ฐ”์ด๋Ÿฌ์Šค ์ „ํŒŒ 2606 DFS/BFS ์—ฐ๊ฒฐ๋œ ์ปดํ“จํ„ฐ ์ˆ˜
์„ฌ์˜ ๊ฐœ์ˆ˜ 4963 DFS(8๋ฐฉํ–ฅ) ์˜์—ญ ํƒ์ƒ‰
๋‹จ์ง€ ๋ฒˆํ˜ธ ๋ถ™์ด๊ธฐ 2667 DFS ์˜์—ญ ๊ฐœ์ˆ˜ ์„ธ๊ธฐ
ํ† ๋งˆํ†  7576 BFS ์ต๋Š” ์‹œ๊ฐ„ (๋‹ค์ค‘ ์‹œ์ž‘์ )
์ˆจ๋ฐ”๊ผญ์งˆ 1697 BFS ์ตœ์†Œ ์ด๋™ ํšŸ์ˆ˜
์œ ๊ธฐ๋† ๋ฐฐ์ถ” 1012 DFS/BFS ์˜์—ญ ํƒ์ƒ‰
์ดŒ์ˆ˜ ๊ณ„์‚ฐ 2644 DFS/BFS ๋‘ ๋…ธ๋“œ ๊ฐ„ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ
๋ฏธ๋กœ ํƒˆ์ถœ 2178 BFS ์ตœ๋‹จ ๊ฒฝ๋กœ ๊ธธ์ด ๊ณ„์‚ฐ
์–‘๊ณผ ๋Š‘๋Œ€ 3184 DFS ์˜์—ญ ๋‚ด ์กฐ๊ฑด ๊ณ„์‚ฐ

๐Ÿ“š ๋ฐฑ๋Œ์ด์˜ ์•”๊ธฐ ํŒ

  • ๐Ÿ”น “DFS๋Š” ๊นŠ์ด, BFS๋Š” ๊ฑฐ๋ฆฌ
  • ๐Ÿ”น DFS๋Š” ์Šคํƒ or ์žฌ๊ท€, BFS๋Š” ํ
  • ๐Ÿ”น 2์ฐจ์› ๋ฌธ์ œ๋Š” ํ•ญ์ƒ dx, dy ์„ธํŠธ ๋จผ์ € ์„ ์–ธ
  • ๐Ÿ”น ๋ฐฉ๋ฌธ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜๋ฉด BFS,
    ํƒ์ƒ‰ ๋ฒ”์œ„๊ฐ€ ์ค‘์š”ํ•˜๋ฉด DFS