codeisneverodd/programmers-coding-test

자물쇠와 열쇠 정답 | | codeisneverodd

Closed this issue · 0 comments

제출한 정답

function solution(key, lock) {
  const N = lock.length;
  const M = key.length;
  const extendedLock = (() => {
    const arr = Array.from({ length: N + 2 * M }, () =>
      Array(N + 2 * M).fill(0)
    );
    for (let i = 0; i < N; i++) {
      for (let j = 0; j < N; j++) {
        arr[M + i][M + j] = lock[i][j];
      }
    }
    return arr;
  })();

  const keys = (() => {
    const rotate = (arr) =>
      arr[0].map((_, colI) => arr.map((row) => row[colI]).reverse());

    const M = key.length;
    let result = [key];
    for (let i = 0; i < 3; i++) {
      result.push(rotate(result[result.length - 1]));
    }
    return result;
  })();

  const check = (key, startIndex) => {
    const result = JSON.parse(JSON.stringify(extendedLock));
    const [x, y] = startIndex;
    for (let i = 0; i < M; i++) {
      for (let j = 0; j < M; j++) {
        result[x + i][y + j] += key[i][j];
      }
    }

    for (let i = M; i < M + N; i++) {
      for (let j = M; j < M + N; j++) {
        if (result[i][j] !== 1) return false;
      }
    }
    return true;
  };

  for (let i = 0; i < N + M; i++) {
    for (let j = 0; j < N + M; j++) {
      if (keys.some((k) => check(k, [i, j]))) return true;
    }
  }

  return false;
}

풀이 데이터

{
  "probId": "60059",
  "author": "codeisneverodd",
  "lang": "JavaScript"
}