본문 바로가기
문제풀이/프로그래머스

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

by 그적 2022. 4. 6.

(문제 설명)

 

(코드)

영역 개수 구할 때 사용하는 함수는 countArea()와 deepCountArea()

최대 영역 크기 구할 때 사용하는 함수는 maxArea()와 deepMaxArea()

이중 for문을 돌면서 재귀 함수로 각각의 index에 deep 하게 접근하는 방식을 택했다. 이때 if문의 조건이 영역 개수, 최대 영역 크기를 구하는 차이라고 보면 된다.

import java.util.*;

class Solution {
    public int[] solution(int m, int n, int[][] picture) {
        int numberOfArea = countArea(picture);
        System.out.println(numberOfArea);
        
        int maxSizeOfOneArea = maxArea(picture);
        System.out.println(maxSizeOfOneArea);

        int[] answer = new int[2];
        answer[0] = numberOfArea;
        answer[1] = maxSizeOfOneArea;
        return answer;
    }
    
    public int countArea(int[][] picture){
        boolean[][] check = new boolean[picture.length][picture[0].length];
        int result = 0;     
        for(int i=0; i<picture.length; i++){
            for(int j=0; j<picture[0].length; j++){
                if(!check[i][j])
                    result += deepCountArea(picture, check, i, j);
            }
        }
        return result;
    }
    
    public int deepCountArea(int[][] picture, boolean[][] check, int x, int y){
        if(check[x][y] || picture[x][y] == 0)
            return 0;

        check[x][y] = true;
        
        if(y<picture[0].length-1 && picture[x][y] == picture[x][y+1]) // 아래
            deepCountArea(picture, check, x, y+1);
        
        if(y>0 && picture[x][y] == picture[x][y-1]) // 위
            deepCountArea(picture, check, x, y-1);
        
        if(x<picture.length-1 && picture[x][y] == picture[x+1][y]) // 오른
            deepCountArea(picture, check, x+1, y);
        
        if(x>0 && picture[x][y] == picture[x-1][y]) // 왼
            deepCountArea(picture, check, x-1, y);
         
        return 1;
    }
    
    public int maxArea(int[][] picture){
        boolean[][] check = new boolean[picture.length][picture[0].length];
        int max = 0;
        
        for(int i=0; i<picture.length; i++){
            for(int j=0; j<picture[0].length; j++){
                if(check[i][j] == false){
                    int tmp = deepMaxArea(picture, check, i, j, picture[i][j]);
                    max = max < tmp ? tmp : max;
                }
            }
        }
        
        return max;
    }
    
     public int deepMaxArea(int[][] picture, boolean[][] check, int x, int y, int before){
        if(check[x][y] || picture[x][y] != before || picture[x][y] == 0)
            return 0;
        
        int count = 1;
        check[x][y] = true;
        
        if(y < picture[0].length-1)   // 아래로
            count += deepMaxArea(picture, check, x, y+1, picture[x][y]);
        
        if(y > 0)  // 위로
            count += deepMaxArea(picture, check, x, y-1, picture[x][y]);
        
        if(x < picture.length-1)  // 오른쪽으로
            count += deepMaxArea(picture, check, x+1, y, picture[x][y]);
        
        if(x > 0)  // 왼쪽으로
            count += deepMaxArea(picture, check, x-1, y, picture[x][y]);
        
        return count;
    }
}

 

댓글