- 문제
- 한 변의 길이가 2제곱수인 정사각형 흑백이미지 배열이 주어짐
- 전체가 0(백) 또는 1(흑)인 경우, 그 값으로 표현('0')해서 리턴
- 아닌 경우, 'X'로 표시하고, 4분할하여 좌상,우상,좌하,우하 순으로 그 값을 평가
- 그렇게 만들어진 결과를 string으로 리턴하라
- 예로 [[0,1],[1,0]]인 경우, 전체를 평가한 X를 누적
- 좌상은 0이 하나니 0, 나머지도 하나씩이니 각 값을 누적
- 결과는 'X0110'이 리턴 된다
- 시도
- 처음 문제를 이해하는데 15분 가량을 소모하였고
- 전체를 어떻게 풀어낼 것인가를 고민하는데 20분 가량을 소모하였다
- 4분할을 할 방법을 아직 풀어내지 못했다
- 수도코드
const decompression = function (image) {
let result = '';
if (image.length === 0) return result;
if (image.length === 1) {
result = result + image[0];
}
else {
let cur = image[0][0];
for (let i = 0; i < image.length; i++) {
for (let j = 0; j < image.length; j++) {
if (image[i][j] !== cur) {
result = result + 'X';
break;
let a = [], b = [], c = [], d = [];
for (let m = 0; m < image.length / 2; m++) {
a.push([]), b.push([]), c.push([]), d.push([])
}
for (let k = 0; k < image.length; k++) {
for (let l = 0; k < image.length; l++) {
if (k < image.length / 2 && l < image.length / 2 ) {
}
if (k < image.length / 2 && l > image.length / 2 ) {
}
if (k > image.length / 2 && l < image.length / 2 ) {
}
if (k > image.length / 2 && l > image.length / 2 ) {
}
}
}
}
}
}
result = result + cur;
}
return result;
};
- 레퍼런스
const decompression = function (image) {
const aux = (rs, re, cs, ce, image) => {
if (rs === re) return String(image[rs][cs]);
const midRow = Math.floor((rs + re) / 2);
const midCol = Math.floor((cs + ce) / 2);
const leftUpper = aux(rs, midRow, cs, midCol, image);
const rightUpper = aux(rs, midRow, midCol + 1, ce, image);
const leftDown = aux(midRow + 1, re, cs, midCol, image);
const rightDown = aux(midRow + 1, re, midCol + 1, ce, image);
const result = leftUpper + rightUpper + leftDown + rightDown;
if (result === '1111') return '1';
else if (result === '0000') return '0';
else return 'X' + result;
};
return aux(0, image.length - 1, 0, image.length - 1, image);
};