圧縮後数世紀
7923 ワード
問題の説明
2 nx 2 nの大きさの2次元整数配列arrがあり,0と1からなる.このarrを四叉木と同じように圧縮したいです.具体的な方法は以下の通りです.
せいげんじょうけん
I/O例
arrresult[[1,1,0,0],[1,0,0,0],[1,0,0,1],[1,1,1,1]][4,9][[1,1,1,1,1,1,1,1],[0,1,1,1,1,1,1,1],[0,0,0,0,1,1,1,1],[0,1,0,0,1,1,1,1],[0,0,0,0,0,0,1,1],[0,0,0,0,0,0,0,1],[0,0,0,0,1,0,0,1],[0,0,0,0,1,1,1,1]][10,15]
I/O例説明
I/O例#1
[4,9]
を返さなければならない.[10,15]
を返さなければならない.に答える
function solution(arr) {
// 정사각형이 1*1이 될 때까지 나눠야 하는 횟수
let count = Math.log2(arr.length);
// 정사각형의 한 변의 길이 n
let n = arr.length;
let answer = [0, 0];
for(let i=0; i<=count; i++) {
let tempArr = [];
for(let j=0; j<arr.length; j+=n) {
for(let k=0; k<arr[0].length; k+=n) {
// n번째 내부 배열과 내부 배열의 n번째 요소까지 잘라서 정사각형꼴로 만든다
let square = arr.slice(j, j+n).map(e => e.slice(k, k+n));
// 정사각형 안의 모든 값을 더한다.
let sum = square.flatMap(e => e).reduce((a, b) => a+b);
// 더한 값이 0이면 모든 요소가 0이고, n*n이면 모든 요소가 1이고, 둘 다 아니면 tempArr에 푸시한다.
if(sum === 0) answer[0]++
else if(sum === n*n) answer[1]++
else tempArr.push(square);
}
}
// tempArr에 푸시한 2차원 배열을 1차원 배열로 arr에 갱신
arr = tempArr.flatMap(e => e);
// 정사각형의 한 변의 길이를 반으로 줄이고, n이 1이 될 때까지 반복
n /= 2;
}
return answer;
}
Reference
この問題について(圧縮後数世紀), 我々は、より多くの情報をここで見つけました https://velog.io/@ziven/쿼드압축-후-개수-세기-kkgg30q2テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol