Algorithm/Programmers

[Lv.2] 카카오프렌즈 컬러링북

시롱시롱 2023. 4. 11. 21:39
class Solution {
    static boolean[][] areaFlag;
    static int[][] pictureGrid;
    static int height,width;
    public int[] solution(int m, int n, int[][] picture) {
        int numberOfArea = 0;
        int maxSizeOfOneArea = 0;
        height=m;
        width=n;
        pictureGrid = picture.clone();
        areaFlag=new boolean[m][n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if(!areaFlag[i][j]&&picture[i][j]!=0){
                    //검사되지 않은 영역을 대상으로 검사한다.
                    areaFlag[i][j] = true;
                    numberOfArea++;
                    int areaSize=1;
                    areaSize=dfs(i,j,areaSize);
                    maxSizeOfOneArea=Math.max(maxSizeOfOneArea,areaSize);
                }
            }
        }


        int[] answer = new int[2];
        answer[0] = numberOfArea;
        answer[1] = maxSizeOfOneArea;
        return answer;
    }
    public int dfs(int i,int j,int areaSize){
        if(i>0){
            //상
            if(!areaFlag[i-1][j]&&pictureGrid[i-1][j]==pictureGrid[i][j]){
                //해당 좌표를 확인하지 않았고 해당 좌표의 색과 현재 검사하는 좌표의 색이 일치하는 경우 같은 영역이다.
                areaFlag[i-1][j] =true;
                areaSize++;
                areaSize=dfs(i-1,j,areaSize);
            }
        }
        if(i<height-1){
            //하
            if(!areaFlag[i+1][j]&&pictureGrid[i+1][j]==pictureGrid[i][j]){
                //해당 좌표를 확인하지 않았고 해당 좌표의 색과 현재 검사하는 좌표의 색이 일치하는 경우 같은 영역이다.
                areaFlag[i+1][j] =true;
                areaSize++;
                areaSize=dfs(i+1,j,areaSize);
            }
        }
        if(j>0){
            //좌
            if(!areaFlag[i][j-1]&&pictureGrid[i][j-1]==pictureGrid[i][j]){
                //해당 좌표를 확인하지 않았고 해당 좌표의 색과 현재 검사하는 좌표의 색이 일치하는 경우 같은 영역이다.
                areaFlag[i][j-1] =true;
                areaSize++;
                areaSize=dfs(i,j-1,areaSize);
            }
        }
        if(j<width-1){
            //우
            if(!areaFlag[i][j+1]&&pictureGrid[i][j+1]==pictureGrid[i][j]){
                //해당 좌표를 확인하지 않았고 해당 좌표의 색과 현재 검사하는 좌표의 색이 일치하는 경우 같은 영역이다.
                areaFlag[i][j+1] =true;
                areaSize++;
                areaSize=dfs(i,j+1,areaSize);
            }
        }
        return areaSize;
    }
}

간단한 dfs문제였다. bfs로도 풀 수 있을 것 같긴 하다.