728x90
모든 배열의 값이 같은 경우를 처리하는 것이 까다로웠다.
import java.util.*;
class Solution {
int[][] data = null;
int zeroCnt = 0;
int oneCnt = 0;
public int[] solution(int[][] arr) {
data = arr;
// 모든 수가 같은 배열일 경우 체크
Boolean isOneValue = true;
int standard = data[0][0];
for (int[] d : data) {
for (int n : d) {
if (n != standard) {
isOneValue = false;
}
}
}
if (isOneValue) {
if (standard == 0) {
zeroCnt += 1;
} else {
oneCnt += 1;
}
} else {
quadCompress(0, 0, data.length / 2);
}
return new int[] { zeroCnt, oneCnt };
}
public void quadCompress(int r, int c, int range) {
if (range >= 1) {
int[] cols = { 0, range, 0, range };
int[] rows = { 0, 0, range, range };
for (int count = 0; count < 4; count++) {
int row = r + rows[count];
int col = c + cols[count];
int standard = data[row][col];
Boolean flag = true;
for (int i = 0; i < range; i++) {
for (int j = 0; j < range; j++) {
if (standard != data[row + i][col + j]) {
flag = false;
}
}
}
if (!flag) {
// 탐색결과 압축될 수 없다면 range를 좁혀 재실행
// 단 더이상 압축될 수 없는 1일때는 압축을 중지하고 갯수세기
if (range == 1) {
for (int i = 0; i < range; i++) {
for (int j = 0; j < range; j++) {
int value = data[row + i][col + j];
if (value == 0) {
zeroCnt += 1;
} else {
oneCnt += 1;
}
}
}
} else {
quadCompress(row, col, range / 2);
}
} else {
// 압축될 수 있다면 해당 범위만큼은 1개로 세기
if (standard == 0) {
zeroCnt += 1;
} else {
oneCnt += 1;
}
}
}
}
}
}