Algorithm/LeetCode

200. Number of Islands

사랑우주인 2024. 10. 21. 11:16

문제

전형적인 bfs 탐색 문제였다. 0은 물, 1은 땅을 의미하는 그래프 배열이 주어진다. 땅이 근접하게 모여 있으면 하나의 섬이다. 섬의 갯수를 요구하는 문제였다.

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

Solution

class Solution {
    static int[][] dirArray = {{-1,0},{1,0},{0,-1},{0,1}};
    public int numIslands(char[][] grid) {

        int m = grid.length;
        int n = grid[0].length;
        boolean[][]visited = new boolean[m][n];
        int answer=0;

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

            }
        return answer;
    }

    public void bfs(char[][] grid, boolean[][] visited, int[] start) {
        int m = grid.length;
        int n = grid[0].length;
        Queue<int[]> q =new LinkedList<>();
        q.offer(start);
        visited[start[0]][start[1]] = true;

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

            for(int[] d: dirArray) {
                int[] next = new int[]{cur[0]+d[0], cur[1]+d[1]};
                if(next[0]>=0 && next[0]<m && next[1]>=0 && next[1]<n &&
                visited[next[0]][next[1]]==false && grid[next[0]][next[1]]=='1') {
                    q.offer(next);
                    visited[next[0]][next[1]] = true;
                } 
            }
        }
    }
}

회고

                if(!visited[i][j] && grid[i][j]=='1') {
                    answer++;
                    bfs(grid, visited, new int[]{i,j});
                }

if문의 중괄호를 빼먹어서 틀린 이유를 한참을 찾았다...주의...하자...