ํด๋น ๊ฒ์๋ฌผ์ ๋ต์๋์ 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];
}
}