[프로그래머스] Lv3. 자물쇠와 열쇠 - JavaScript

이상돈·2023년 12월 22일
post-thumbnail

문제분류 : 코팅테스트 연습

난이도 : Level 3

출처 : 프로그래머스 - 자물쇠와 열쇠

문제

제한사항

📌 내가 생각한 풀이

이동, 회전을 생각하며 완전탐색을 해야하는 문제이다. 즉, 회전 함수를 만들고, 배열의 크기를 늘려서 이동을 만들어주자.
const rotate = arr => {
  let len = arr.length;
  let newArr = Array.from(Array(len), () => Array(len).fill(0));
  for (var i = 0; i < len; i++) {
    for (var k = 0; k < len; k++) {
      newArr[i][k] = arr[len - 1 - k][i];
    }
  }
  return newArr;
};

function solution(key, lock) {
  let lockLen = lock.length;
  let keyLen = key.length;
  let total = (keyLen - 1) * 2 + lockLen;
  let newBoard = Array.from(Array(total), () => Array(total).fill(0));
  let a = 0;
  let b = 0;

  const check = arr => {
    for (var i = keyLen - 1; i < keyLen - 1 + lockLen; i++) {
      for (var k = keyLen - 1; k < keyLen - 1 + lockLen; k++) {
        if (arr[i][k] !== 1) return false;
      }
    }
    return true;
  };

  for (var i = keyLen - 1; i < keyLen - 1 + lockLen; i++) {
    for (var k = keyLen - 1; k < keyLen - 1 + lockLen; k++) {
      newBoard[i][k] = lock[a][b++];
    }
    a++;
    b = 0;
  }
  for (var i = 0; i < 4; i++) {
    key = rotate(key);
    for (var j = 0; j <= total - keyLen; j++) {
      for (var m = 0; m <= total - keyLen; m++) {
        const boardSlice = JSON.parse(JSON.stringify(newBoard));
        for (var q = 0; q < keyLen; q++) {
          for (var w = 0; w < keyLen; w++) {
            boardSlice[j + q][m + w] += key[q][w];
          }
        }
        if (check(boardSlice)) return true;
      }
    }
  }
  return false;
}

📌 느낀점

배열에서 이동을 배열의 크기를 넓혀서 사용한다는 점에 매우 놀랐다. 역시 카카오는 카카오인가.... 너무 획기적인 문제였다고 생각한다.

profile
사람들의 더 나은 삶을 위한 개발자

0개의 댓글