문제가 다소 난해하여 푸는데 꽤나 많은시간이 걸렸다.
특히 회전시키는 부분이 어려웟는데, 다시 생각해보니 열쇠의 회전 부분은 3번만 진행하면 된다.
굳이 모든 위치에서 회전을 확인할 필요가 없으므로 회전 시킨 이후 큰 배열을 선언후 확인하면 풀 수 있다.
//(y,x) => (x, n-y) 회전에 관련된 함수에서 가져왔습니다.
// 다소 헷갈리지만 작은 배열부터 만들어가며 관계식을 찾아봅니다.
for(let i=0; i<KEYLEN; i++){
for(let j=0; j<KEYLEN; j++){
rotatedKey[i][j] += key[KEYLEN-j-1][i]
}
}
function solution(key, lock) {
var answer = true;
const KEYLEN = key.length
const LOCKLEN = lock.length
let board = makeBoard(KEYLEN , LOCKLEN , lock );// 전체 lock이 포함될만큼 큰 배열을 만들어줍니다.
// 이 배열의 내부에서 key를 회전시켜가며 딱 들어맞는지 확인합니다.
for(let dir=0; dir< 4; dir++){
// 방향회전 4번을 진행합니다.
key = rotation(KEYLEN, key); // 한번 회전시킨 함수를 반복하여 회전시킵니다.
for(let i=0; i<KEYLEN+LOCKLEN+1; i++){
// 아래로 이동합니다.
for(let j=0; j<KEYLEN+LOCKLEN+1; j++){
// 오른쪽으로 이동합니다.
board = drawKey(i,j,key,board)
if(isAnswer (KEYLEN,LOCKLEN, board)){
return true
}
board = makeBoard(KEYLEN , LOCKLEN , lock )
}
}
}
return false;
}
function drawKey(startY, startX,key, board){
for(let i=0; i<key.length; i++ ){
for(let j=0; j<key.length; j++){
board[startY+i][startX+j]+= key[i][j]
}
}
return board
}
function rotation (KEYLEN,key) { // key 를 받고 회전을 시킬겁니다.
const rotatedKey = [];
for(let i=0; i<KEYLEN; i++){
rotatedKey.push([])
for(let j=0; j<KEYLEN; j++){
rotatedKey[i].push(0)
}
}
//(y,x) => (x, n-y)
for(let i=0; i<KEYLEN; i++){
for(let j=0; j<KEYLEN; j++){
rotatedKey[i][j] += key[KEYLEN-j-1][i]
}
}
return rotatedKey
// 결과로 배열을 반환합니다.
}
function makeBoard (KEYLEN, LOCKLEN, lock){
const board =[];
const boardSize = 2*KEYLEN + LOCKLEN
for(let i=0; i< boardSize; i++){
board.push([])
for(let j=0; j<boardSize; j++){
board[i].push(0)
}
}
for(let i=0; i<LOCKLEN; i++){
for(let j=0; j< LOCKLEN; j++){
board[KEYLEN+i][KEYLEN+j] += lock[i][j]
}
}
return board
}
function isAnswer (KEYLEN,LOCKLEN, board){
for(let i=0; i<LOCKLEN; i++){
for(let j=0; j< LOCKLEN; j++){
if(board[KEYLEN+i][KEYLEN+j] !== 1)
return false
}
}
return true;
}