algorithm/leetcode

[leetcode] Number of Islands 정리

무대포 개발자 2022. 1. 28. 14:00
728x90
반응형

source 는 Github 에 있습니다.

문제 (Number of Islands)

풀이

  • 연결된 섬들은 1개로 count 합니다.
    • for 문을 2번 돌려서 순회를 하면 연결된 섬에 대해서 찾을 수 없습니다.
  • 전체 grid 를 순회하면서 방문한 곳은 순회하지 않도록 구현해서 처리했습니다.
    • 순회할 때, DFS 를 써서 연결된 것들을 순회하게 했습니다.
    • 순회할 때는 상하좌우로 순회하게 했습니다.

source


    public int numIslands(char[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        visited = new boolean[m][n];
        int count = 0;
        for (int i = 0 ; i < m ; i++) {
            for (int j = 0 ; j < n ; j++) {
                if (visited[i][j] == false) {
                    count += numIslands(grid, i, j);
                }
            }
        }
        return count;
    }

    public int numIslands(char[][] grid, int x, int y) {
        int m = grid.length;
        int n = grid[0].length;
        int count = 0;
        if (m > x && x >= 0 && n > y && y >= 0 &&
                grid[x][y] == '1' && visited[x][y] == false) {
            count++;
            visited[x][y] = true;
            count += numIslands(grid, x, y + 1);
            count += numIslands(grid, x + 1, y);
            count += numIslands(grid, x - 1, y);
            count += numIslands(grid, x, y - 1);
        }
        return count > 0 ? 1 : 0; // 연결된 것들은 1개로 count
    }

복잡도

  • 시간복잡도 : 섬을 한 번씩은 전부 순회해야하기에 O(n 제곱) 입니다. (grid 가 m*n 으로 이루어져있으므로)
  • 공간복잡도 : 방문한 곳을 변수로 저장하기 위해 boolean 2차 배열을 (m * n) 사용했으니 O(n 제곱) 입니다.