[LeetCode]Number of Islands

Icarus<Wing>ยท2025๋…„ 5์›” 9์ผ
post-thumbnail

https://leetcode.com/problems/number-of-islands/description/

๐Ÿ“œ๋ฌธ์ œ ํ•ด์„

m x n 2์ฐจ์› binary grid๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์„ฌ๋“ค์˜ ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋ผ.(grid์˜ '1'์€ land๋ฅผ, '0'์€ ๋ฌผ์„ ์˜๋ฏธํ•œ๋‹ค.)

  • ์„ฌ๋“ค์€ ๋ฌผ๋กœ ๋‘˜๋Ÿฌ์Œ“์—ฌ ์žˆ๊ณ , ์—ฐ๊ฒฐ๋œ ์ธ์ ‘์˜ ์„ฌ๋“ค์ด ์ˆ˜ํ‰์ ์œผ๋กœ ๋˜๋Š” ์ˆ˜์ง์ ์œผ๋กœ ํ˜•์„ฑ๋˜์–ด ์žˆ๋‹ค.
  • ๋‹น์‹ ์€ grid์˜ ๋ชจ๋“  4๊ฐœ์˜ ๊ฐ„์„ ๋“ค์ด ๋ฌผ๋กœ ๋‘˜๋Ÿฌ์Œ“์—ฌ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋„ ๋œ๋‹ค.

๐Ÿšง์ œ์•ฝ ์กฐ๊ฑด
1. m == grid.length (row), n == grid[i].length (col)
2. 1 <= m, n <= 300
3. grid[i][j]๋Š” '0' ๋˜๋Š” '1'์ด๋‹ค.

์œ„ ๋ฌธ์ œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ bfs ๋˜๋Š” dfs๋กœ ํ’€ ์ˆ˜ ์žˆ๋‹ค.
โฐ์ฐธ๊ณ ๋กœ, grid์˜ ๋ชจ๋“  ์›์†Œ๋ฅผ ํƒ์ƒ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„๋ณต์žก๋„๋Š” bfs, dfs ๋‘˜๋‹ค O(Mโˆ—N)O(M*N)์ด๋‹ค.

bfs ํ’€์ด

โš™๏ธ์ฝ”๋“œ ์„ค๊ณ„

์›๋ณธ grid ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด boolean ํƒ€์ž…์˜ 2์ฐจ์› ๋ฐฐ์—ด visited๋กœ grid์˜ ํฌ๊ธฐ๋งŒํผ ์„ค์ •ํ•˜์˜€๊ณ  ์„ฌ๋“ค์˜ ์ˆ˜๋ฅผ ์นด์šดํŠธ ํ•˜๊ธฐ ์œ„ํ•ด island๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜์˜€๋‹ค.

๐Ÿค”์•”์‹œ์  ๊ทธ๋ž˜ํ”„๋กœ ์ฃผ์–ด์ง„ grid๋ฅผ bfs์—์„œ ์ˆœํšŒํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜์ง€? ์ฆ‰, HashMap ํƒ€์ž…์˜ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์•„๋‹ ๋•Œ, for๋ฌธ์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜์ง€?
๐Ÿ”จintํƒ€์ž…์˜ dr, dc๋กœ ์ƒ, ํ•˜, ์ขŒ, ์šฐ๋ฅผ ์„ค์ •ํ•œ ํ›„, for๋ฌธ์œผ๋กœ ์ˆœํšŒ์‹œํ‚ค๋ฉด ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  bfs ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ์€ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

๐Ÿ’ป์ฝ”๋“œ ๊ตฌํ˜„

public class IslandsSolution {
    public int numIslands(char[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        boolean[][] visited = new boolean[m][n];
        int island = 0;

        // dr, dc ์„ธํŒ…
        int[] dr = {-1, 1, 0, 0};
        int[] dc = {0, 0, -1, 1};

        // ์™„์ „ ํƒ์ƒ‰
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                // ์„ฌ์ด๊ณ  ํ˜„์žฌ ๋ฐฉ๋ฌธ์„ ํ•˜์ง€ ์•Š์•˜์œผ๋ฉด
                if (grid[i][j] == '1' && !visited[i][j]) {
                    // bfs ํƒ์ƒ‰ ์‹œ์ž‘ and ์‚ฌ์ „ ์„ธํŒ…
                    Queue<Pair> q = new LinkedList<>();
                    q.offer(new Pair(i, j));
                    visited[i][j] = true;

                    while (!q.isEmpty()) {
                        Pair cur = q.poll();
                        int startR = cur.r;
                        int startC = cur.c;

                        for (int k = 0; k < 4; k++) {
                            int nextR = startR + dr[k];
                            int nextC = startC + dc[k];

                            if ((0 <= nextR && nextR < m) && (0 <= nextC && nextC < n)) {
                                if (!visited[nextR][nextC] && grid[nextR][nextC] == '1') {
                                    visited[nextR][nextC] = true;
                                    q.offer(new Pair(nextR, nextC));
                                }

                            }
                        }
                    }
                    island++;

                }

            }
        }
        return island;
    }

    private static class Pair {
        int r;
        int c;

        public Pair(int r, int c) {
            this.r = r;
            this.c = c;
        }
    }
    
}

ํŒŒ์ด์ฌ๊ณผ ๋‹ค๋ฅด๊ฒŒ bfs ํ•จ์ˆ˜๋ฅผ ์บก์Аํ™”ํ•˜๋Š”๋ฐ dr, dc๋ฅผ ํด๋ž˜์Šค ๋ ˆ๋ฒจ๋กœ ์„ ์–ธํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ์ฒ˜๋ฆฌ๊ฐ€ ๊นŒ๋‹ค๋กญ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ƒฅ ๋ฉ”์„œ๋“œ ์•ˆ์— ํ•„์š”ํ•œ ๋กœ์ง๋“ค์„ ์ „๋ถ€ ๋„ฃ์—ˆ๋‹ค.

๐Ÿ“–์Šคํ† ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:
1. bfs์—์„œ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ชจ๋ฐฉํ•˜๊ธฐ ์œ„ํ•ด dr, dc๋ฅผ ์„ค์ •ํ•˜์˜€๋‹ค.
2. 2์ค‘ for๋ฌธ์œผ๋กœ grid๋ฅผ ์™„์ „ ํƒ์ƒ‰ํ•  ๋•Œ grid๊ฐ€ '1'์ด๊ณ  ํ˜„์žฌ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜์œผ๋ฉด bfs ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•œ๋‹ค.
3. ํ˜„์žฌ ์ขŒํ‘œ๋ฅผ bfs ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ์—์„œ ์‚ฌ์ „ ์„ธํŒ…์— ํ• ๋‹นํ•˜์˜€๊ณ , ์ด๋•Œ ํ˜„์žฌ ์ขŒํ‘œ๋ฅผ queue์— ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ์ปค์Šคํ…€ ํด๋ž˜์Šค๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค.
4. for๋ฌธ์œผ๋กœ dr, dc์˜ ํฌ๊ธฐ๋งŒํผ ์ˆœํšŒํ•˜๋Š”๋ฐ, grid์˜ ๋ฒ”์œ„ ๋‚ด์— ์žˆ๊ณ  grid๊ฐ€ '1'์ด๋ฉฐ ํ˜„์žฌ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜์œผ๋ฉด ๋ฐฉ๋ฌธํ–ˆ๋‹ค๊ณ  ํ‘œ์‹œํ•˜๊ณ  ํ์— ์ถ”๊ฐ€๋ฅผ ํ•œ๋‹ค.
5. ํ๊ฐ€ ๋น„์—ˆ์œผ๋ฉด bfs๊ฐ€ ๋๋‚œ๊ฑฐ๋‹ˆ๊นŒ island๋ฅผ 1๋งŒํผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
6. ์™„์ „ ํƒ์ƒ‰์„ ๋๋‚ด๋ฉด island๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

dfs ํ’€์ด

โš™๏ธ ์ฝ”๋“œ์„ค๊ณ„

dfs ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ–ˆ๊ณ , bfs์˜ ์•”์‹œ์  ๊ทธ๋ž˜ํ”„ ํ™œ์šฉ๋„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ ์„ค๊ณ„๋Š” ํ•˜์ง€ ์•Š์•˜๋‹ค.

๐Ÿ’ป์ฝ”๋“œ ๊ตฌํ˜„

public class IslandsSolution {
    public int numIslands(char[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        boolean[][] visited = new boolean[m][n];
        int island = 0;

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j] == '1' && !visited[i][j]) {
                    island += dfs(grid, visited, i, j, m, n);
                }
            }
        }
        return island;
    }

    private int dfs(char[][] grid, boolean[][] visited, int startR, int startC, int m, int n) {
        int[] dr = {1, -1, 0, 0};
        int[] dc = {0, 0, -1, 1};
        visited[startR][startC] = true;

        for (int k = 0; k < 4; k++) {
            int nextR = startR + dr[k];
            int nextC = startC + dc[k];

            if ((0 <= nextR) && (nextR < m) && (0 <= nextC) && (nextC < n) && grid[nextR][nextC] == '1' && !visited[nextR][nextC]) {
                dfs(grid, visited, nextR, nextC, m, n);
            }
        }
        return 1;
    }
    
}
  • dfs ์žฌ๊ท€ ํ•จ์ˆ˜ ์ธ์ž์— nextR, nextC๋ฅผ ์ „๋‹ฌํ•ด์„œ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ชจ๋ฐฉํ•˜์˜€๋‹ค.

๐Ÿ“bfs๋Š” ํ์— ์ขŒํ‘œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ์ปค์Šคํ…€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ, dfs๋Š” ํ•จ์ˆ˜ ๋ถ€๋ถ„์— ์ขŒํ‘œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์ „๋‹ฌ๋งŒ ํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ ์ปค์Šคํ…€ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†์—ˆ๋‹ค๋Š” ์ฐจ์ด์ ์„ ๊นจ๋‹ฌ์•˜๋‹ค.

profile
๋ชจ๋“  ์ฝ”๋“œ์—๋Š” ์ด์œ ๊ฐ€ ์žˆ๊ธฐ์— ์›์ธ์„ ํŒŒ์•…ํ•  ๋•Œ๊นŒ์ง€ ์ง‘์š”ํ•˜๊ฒŒ ํƒ๊ตฌํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€