사실 이문제는 3번정도 풀어서 알고리즘을 외웠지만.. 다시 한번 배열을 공부한다는 마음으로 다시풀어봤다.

문제 해석


나의 해석 풀이 과정
나의 코드
function solution(key, lock) {
// 구현 하는 문제도 1 단계에서 나온다고 하니 한번 풀어보자
const keylength= key.length
const locklength= lock.length;
const rotate_90 = function (key) {
let keylength = key.length;
let rotated = Array.from({ length: keylength }, () => Array(keylength).fill(0));
// rotate 하는 부분 처음에 틀렸음.
for (let i = 0; i < keylength; i++) {
for (let j = 0; j < keylength; j++) {
rotated[j][keylength - 1 - i] = key[i][j];
}
}
return rotated;
};
const is_real_= function(new_keys){
for(var sero1=0; sero1<locklength; sero1++){
for(var garo1=0; garo1<locklength; garo1++){
if(new_keys[sero1+keylength-1][garo1+keylength-1]!=1){
return false;
}
}
}
return true;
}
// 여기 부분은 lock 된 부분을 채우는거 length
let new_key= Array.from({length:keylength*2 +locklength-2}
,()=>Array(keylength*2 +locklength-2).fill(0))
for(var sero=0; sero<locklength; sero++){
for(var garo=0; garo<locklength ;garo++ ){
new_key[sero+keylength-1][garo+keylength-1]=lock[sero][garo]
}
}
for (let rot = 0; rot < 4; rot++) {
for (var i = 0; i < keylength + locklength - 1; i++) {
for (var z = 0; z < keylength + locklength - 1; z++) {
let copy_lock = new_key.map((el) => [...el]);
let is_vaild=true;
for (var key_sero = 0; key_sero < keylength; key_sero++) {
for (var key_garo = 0; key_garo < keylength; key_garo++) {
// if (copy_lock[i + key_sero][z + key_garo] == 0 && key[key_sero][key_garo] == 1) {
// copy_lock[i + key_sero][z + key_garo] = 1;
// }
//
//
// 키가 1이면 자물쇠의 부분이 0 이여야만함 만약 1 이라면 return 해도됨. 배열에서는 return 이 안되니 is_real 할때 안가면된다고 함
if( key[key_sero][key_garo]==1){
if(copy_lock[i + key_sero][z + key_garo]==1){
is_vaild=false;
}
else{
// 자물쇠 이부분이 0 이라는것
copy_lock[i + key_sero][z + key_garo] = 1;
}
}
}
}
if (is_vaild&&is_real_(copy_lock)) return true;
}
}
key = rotate_90(key);
}
return false;
}