
ํด๋น ๊ฒ์๋ฌผ์ ๋ต์๋์ tistory ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํ์ฌ ์์ฑ๋์์์ ๋ฏธ๋ฆฌ ๋ฐํ๋๋ค.
๊ณ ๊ณ ํ์์ธ "ํ๋ธ"๋ ๊ณ ๋ ์ ์ ์ง์์ ๋ณด๋ฌผ๊ณผ ์ ์ ์ด ๊ฐ๋ํ ๊ฒ์ผ๋ก ์ถ์ ๋๋ ๋น๋ฐ์ ๋ฌธ์ ๋ฐ๊ฒฌํ์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ๋ฌธ์ ์ด๋ ค๊ณ ์ดํด๋ณด๋ ํน์ดํ ํํ์ ์๋ฌผ์ ๋ก ์ ๊ฒจ ์์๊ณ ๋ฌธ ์์๋ ํน์ดํ ํํ์ ์ด์ ์ ํจ๊ป ์๋ฌผ์ ๋ฅผ ํธ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ค์๊ณผ ๊ฐ์ด ์ค๋ช ํด ์ฃผ๋ ์ข ์ด๊ฐ ๋ฐ๊ฒฌ๋์์ต๋๋ค.
์ ๊ฒจ์๋ ์๋ฌผ์ ๋ ๊ฒฉ์ ํ ์นธ์ ํฌ๊ธฐ๊ฐ 1 x 1์ธ N x N ํฌ๊ธฐ์ ์ ์ฌ๊ฐ ๊ฒฉ์ ํํ์ด๊ณ  ํน์ดํ ๋ชจ์์ ์ด์ ๋ M x M ํฌ๊ธฐ์ธ ์ ์ฌ๊ฐ ๊ฒฉ์ ํํ๋ก ๋์ด ์์ต๋๋ค.
์๋ฌผ์ ์๋ ํ์ด ํ์ฌ ์๊ณ ์ด์ ๋ํ ํ๊ณผ ๋๊ธฐ ๋ถ๋ถ์ด ์์ต๋๋ค. ์ด์ ๋ ํ์ ๊ณผ ์ด๋์ด ๊ฐ๋ฅํ๋ฉฐ ์ด์ ์ ๋๊ธฐ ๋ถ๋ถ์ ์๋ฌผ์ ์ ํ ๋ถ๋ถ์ ๋ฑ ๋ง๊ฒ ์ฑ์ฐ๋ฉด ์๋ฌผ์ ๊ฐ ์ด๋ฆฌ๊ฒ ๋๋ ๊ตฌ์กฐ์ ๋๋ค. ์๋ฌผ์ ์์ญ์ ๋ฒ์ด๋ ๋ถ๋ถ์ ์๋ ์ด์ ์ ํ๊ณผ ๋๊ธฐ๋ ์๋ฌผ์ ๋ฅผ ์ฌ๋ ๋ฐ ์ํฅ์ ์ฃผ์ง ์์ง๋ง, ์๋ฌผ์ ์์ญ ๋ด์์๋ ์ด์ ์ ๋๊ธฐ ๋ถ๋ถ๊ณผ ์๋ฌผ์ ์ ํ ๋ถ๋ถ์ด ์ ํํ ์ผ์นํด์ผ ํ๋ฉฐ ์ด์ ์ ๋๊ธฐ์ ์๋ฌผ์ ์ ๋๊ธฐ๊ฐ ๋ง๋์๋ ์๋ฉ๋๋ค. ๋ํ ์๋ฌผ์ ์ ๋ชจ๋ ํ์ ์ฑ์ ๋น์ด์๋ ๊ณณ์ด ์์ด์ผ ์๋ฌผ์ ๋ฅผ ์ด ์ ์์ต๋๋ค.
์ด์ ๋ฅผ ๋ํ๋ด๋ 2์ฐจ์ ๋ฐฐ์ด key์ ์๋ฌผ์ ๋ฅผ ๋ํ๋ด๋ 2์ฐจ์ ๋ฐฐ์ด lock์ด ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ์ด์ ๋ก ์๋ฌผ์ ๋ฅผ ์ด์ ์์ผ๋ฉด true๋ฅผ, ์ด ์ ์์ผ๋ฉด false๋ฅผ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
| key | lock | result | 
|---|---|---|
| [[0, 0, 0], [1, 0, 0], [0, 1, 1]] | [[1, 1, 1], [1, 1, 0], [1, 0, 1]] | true | 

key๋ฅผ ์๊ณ ๋ฐฉํฅ์ผ๋ก 90๋ ํ์ ํ๊ณ , ์ค๋ฅธ์ชฝ์ผ๋ก ํ ์นธ, ์๋๋ก ํ ์นธ ์ด๋ํ๋ฉด lock์ ํ ๋ถ๋ถ์ ์ ํํ ๋ชจ๋ ์ฑ์ธ ์ ์์ต๋๋ค.
function solution(key,lock) {
    // key๊ฐ์ ์
๋ ฅ๋ฐ์ ๋ชจ๋  ๊ฒฝ์ฐ์ ์๋ฅผ ์กฐํํ  ์ ์๋ ์ ์ฌ๊ฐํ ์์ฑ
    const [keyLen, lockLen] = [key.length, lock.length];
    const totalLen = lockLen + keyLen*2 - 2;
    // board ๋ฐฐ์ด ์์ฑ
    const board = Array(totalLen).fill().map(_ => Array(totalLen).fill());
    // board ์ ์ค์์ ๋ฝ ๋ฐฐ์ด ๊ฐ ์ฝ์
    for (let i = keyLen-1; i < keyLen + lockLen - 1; i++) {
        for (let j = keyLen-1; j < keyLen + lockLen - 1; j++) {
            board[i][j] = lock[i-(keyLen-1)][j-(keyLen-1)];
        }
    }
    // ์ ์ฌ๊ฐํ ๋ฐฐ์ด์ ํฌ๊ธฐ์ ์๊ด์์ด ํ์ ์ํด
    const rotateRight = (arr) => {
        const len = arr.length;
        // ์ ์ฌ๊ฐํ ๋ฐฐ์ด ์์ฑ
        const tmp = Array(len).fill().map(_ => Array(len).fill());
        // ํ์ 
        for (let i = 0; i < len; i++) {
            for (let j = 0; j < len; j++) {
                tmp[j][len-1-i] = key[i][j];
            }
        }
        return tmp;
    };
    // ์๋ฌผ์ ๊ฐ ์ด๋ฆฌ๋์ง ๊ฒ์ฌ
    const isValid = (arr) => {
        // board ๋ฐฐ์ด์์ ์ค์  ๋ฝ ๋ฐฐ์ด์ ๊ฐ์ด ํฌํจ๋ ๋ถ๋ถ๋ง ๊ฒ์ฌํ๋ค.
        for (let i = keyLen-1; i < keyLen + lockLen -1; i++) {
            for (let j = keyLen-1; j < keyLen + lockLen -1; j++) {
                if (arr[i][j] !== 1) return false;
            }
        }
        return true;
    };
    // ํค๋ฅผ ๋๋ ค๊ฐ๋ฉฐ ๋ชจ๋  ๊ฒฝ์ฐ์ ์ ํ์
    for (let rotate = 0; rotate < 4; rotate++) {
        // ์์
 ์ํ ์ต์ํ ์ํด ์ฒ์์๋ ๋กํ
์ด์
 ์ ํจ
        key = rotate === 0 ? key : rotateRight(key);
        for (let i = 0; i <= totalLen - keyLen; i++) {
            for (let j = 0; j <= totalLen - keyLen; j++) {
                // ์ ๊ฐ ์ฐ์ฐ์๋ฅผ ํตํด board ์๋ณธ ๊ฐ์ ์ํฅ์ฃผ์ง ์๋๋ก ์นดํผ
                const boardCopy = board.map(arr => [...arr]);
                for (let r = 0; r < keyLen; r++) {
                    for (let c = 0; c < keyLen; c++) {
                        // ์ด์ ์ ํ๊ณผ ์๋ฌผ์ ์ ํ์ด ๋ง๋๋ฉด ์ ๋๊ธฐ ๋๋ฌธ์ ํ๋ผ๋ฆฌ ๋ง๋๋ ๊ฒฝ์ฐ ๊ฐ 2๋ก ์์ 
                        if (key[r][c] === 1 && boardCopy[i+r][j+c] === 1) boardCopy[i+r][j+c] = 2;
                        else if (key[r][c] === 1 && boardCopy[i+r][j+c] === 0) boardCopy[i+r][j+c] = 1;
                    }
                }
                if (isValid(boardCopy) === true) return true;
            }
        }
    }
    return false
}
ํด๋น ๋ฌธ์ ์ ์ค์ ํฌ์ธํธ๋ ์๋ ์๋ฌผ์ ๋ฐฐ์ด๋ณด๋ค ํฐ ๋ฐฐ์ด์ ๋ง๋ค์ด ํ ์คํธ ํ๋ ๊ฒ์ด๋ค.
๋ค๋ฅธ ํฌ์ธํธ๋ก๋ ํค๋ฅผ ๋๋ฆฌ๋ ๋ฐฉ๋ฒ์ด ๋๋ฌด ์ธ์๊น์๋๋ฐ
์ ์ฌ๊ฐํ ๊ธฐ์ค i์ j๋ฅผ ๋ณ์ ๊ธธ์ด๋งํผ ๋ฐ๋ณตํ๋ฉฐ,
๊ธธ์ด์์ 1์ ๋บ ๊ฐ์ i๋ฅผ ์ถ๊ฐ๋ก ๋นผ์ฃผ๋ฉด 90๋ ํ์ ์ ๊ตฌํํ  ์ ์๋ ๊ฒ ๊ฐ์
// ํ์ 
        for (let i = 0; i < len; i++) {
            for (let j = 0; j < len; j++) {
                tmp[j][len-1-i] = key[i][j];
            }
        }