내꺼

class Solution {
    private static int[][] map;
    public int[] solution(int[][] arr) {
        map = arr;
        int idx = doCompress(0,0,arr.length);
        if(idx < 2){
            int[] ans = new int[2];
            ans[idx]++;
            return ans;
        }
        return compress(0,0,arr.length);
    }
    
    private static int[] compress(int si, int sj, int length){
        //끝내는 조건
        if(length == 1){
            if(map[si][sj] == 0){
                return new int[]{1,0};
            }else{
                return new int[]{0,1};
            }
        }
        //4번해야됨...
        //시작지점 4개로 분화 시킨다.
        int[] result = new int[2];
        
        int idx = doCompress(si,sj,length/2);
        if(idx < 2){
            result[idx]++;
        }else{
            int[] compressResult = compress(si,sj,length/2);
            result[0] += compressResult[0];
            result[1] += compressResult[1];
        }
        
        idx = doCompress(si,sj+length/2,length/2);
        if(idx < 2){
            result[idx]++;
        }else{
            int[] compressResult = compress(si,sj+length/2,length/2);
            result[0] += compressResult[0];
            result[1] += compressResult[1];
        }
        
        idx = doCompress(si+length/2,sj,length/2);
        if(idx < 2){
            result[idx]++;
        }else{
            int[] compressResult = compress(si+length/2,sj,length/2);
            result[0] += compressResult[0];
            result[1] += compressResult[1];
        }
        
        idx = doCompress(si+length/2,sj+length/2,length/2);
        if(idx < 2){
            result[idx]++;
        }else{
            int[] compressResult = compress(si+length/2,sj+length/2,length/2);
            result[0] += compressResult[0];
            result[1] += compressResult[1];
        }
        
        return result;
    }
    
    private static int doCompress(int si, int sj, int length){
        int std = map[si][sj];
        for(int i = si; i<si+length ; i++){
            for(int j=sj ; j<sj+length ; j++){
                if(std != map[i][j]){
                    return 3;
                }
            }
        }
        return std;
    }
}