프로그래머스 코딩테스트 연습/Level2

[프로그래머스][JAVA] 카카오프렌즈 컬러링북

긷뚜 2021. 5. 6. 12:27
728x90

programmers.co.kr/learn/courses/30/lessons/1829

 

코딩테스트 연습 - 카카오프렌즈 컬러링북

6 4 [[1, 1, 1, 0], [1, 2, 2, 0], [1, 0, 0, 1], [0, 0, 0, 1], [0, 0, 0, 3], [0, 0, 0, 3]] [4, 5]

programmers.co.kr

동적 계획법으로 풀었다

방문 확인을 위해 picture배열과 같은 크기의 boolean 타입의 배열 visit 을 만들고

picture배열을 확인하며 0이 아니면서 위치의 visit 배열이 false일때 DP 함수를 돌렸다

DP함수에서는 상하좌우로 움직이며 방문 표시와 함께 총 넓이를 저장 해줬고

연산이 끝나면 기존에 있던 최대 넓이를 의미하는 변수인 maxCount와 Max 비교와

영역 개수를 의미하는 areaCount값을 1씩 더해줬다

import java.lang.Math;
class Solution {
    private static int X;
    private static int Y;
    public int[] solution(int m, int n, int[][] picture) {
        int[] answer = new int[2];
        int maxCount = 0;	//최대 넓이 영역의 넓이
        int areaCount = 0;	//영역 개수
        Y = m;
        X = n;
        boolean[][] visit = new boolean[m][n];
        for(int i =0;i<m;i++){
            for(int j=0;j<n;j++){
                int temp = DP(picture,visit,j,i,picture[i][j]);
                if(temp >0){
                    areaCount++;
                    maxCount = Math.max(temp,maxCount);
                }
                
               
            }
        }
        answer[0] = areaCount;
        answer[1] = maxCount;
         return answer;
    }
    public int DP(int[][] picture, boolean[][] visit, int x, int y,int target){
        if(x==-1||y==-1||x==X||y==Y||target==0){return 0;}
        if(visit[y][x]||picture[y][x]==0||picture[y][x]!=target){
            return 0;
        }
        
        int result = 1;
        visit[y][x] = true;
        result +=DP(picture,visit,x-1,y,target);	//좌
        result +=DP(picture,visit,x+1,y,target);	//우
        result +=DP(picture,visit,x,y-1,target);	//상
        result +=DP(picture,visit,x,y+1,target);	//하
            
        return result;
    }
}
728x90