[Refresh ! 코딩 테스트 / js] - 자물쇠와 열쇠

정대만·2025년 2월 26일

사실 이문제는 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;
}

  • 만약 이 문제가 나왔다면 절대 시간내에 못 풀었을거 같다... 이거를 푸는 사람들은 천재일까?
profile
안녕하세요

0개의 댓글