내꺼
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;
}
}