๐ ๋ฌธ์
๊ณ ๊ณ ํ์์ธ "ํ๋ธ"๋ ๊ณ ๋ ์ ์ ์ง์์ ๋ณด๋ฌผ๊ณผ ์ ์ ์ด ๊ฐ๋ํ ๊ฒ์ผ๋ก ์ถ์ ๋๋ ๋น๋ฐ์ ๋ฌธ์ ๋ฐ๊ฒฌํ์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ๋ฌธ์ ์ด๋ ค๊ณ ์ดํด๋ณด๋ ํน์ดํ ํํ์ ์๋ฌผ์ ๋ก ์ ๊ฒจ ์์๊ณ ๋ฌธ ์์๋ ํน์ดํ ํํ์ ์ด์ ์ ํจ๊ป ์๋ฌผ์ ๋ฅผ ํธ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ค์๊ณผ ๊ฐ์ด ์ค๋ช
ํด ์ฃผ๋ ์ข
์ด๊ฐ ๋ฐ๊ฒฌ๋์์ต๋๋ค.
์ ๊ฒจ์๋ ์๋ฌผ์ ๋ ๊ฒฉ์ ํ ์นธ์ ํฌ๊ธฐ๊ฐ 1 x 1์ธ N x N ํฌ๊ธฐ์ ์ ์ฌ๊ฐ ๊ฒฉ์ ํํ์ด๊ณ ํน์ดํ ๋ชจ์์ ์ด์ ๋ M x M ํฌ๊ธฐ์ธ ์ ์ฌ๊ฐ ๊ฒฉ์ ํํ๋ก ๋์ด ์์ต๋๋ค.
์๋ฌผ์ ์๋ ํ์ด ํ์ฌ ์๊ณ ์ด์ ๋ํ ํ๊ณผ ๋๊ธฐ ๋ถ๋ถ์ด ์์ต๋๋ค. ์ด์ ๋ ํ์ ๊ณผ ์ด๋์ด ๊ฐ๋ฅํ๋ฉฐ ์ด์ ์ ๋๊ธฐ ๋ถ๋ถ์ ์๋ฌผ์ ์ ํ ๋ถ๋ถ์ ๋ฑ ๋ง๊ฒ ์ฑ์ฐ๋ฉด ์๋ฌผ์ ๊ฐ ์ด๋ฆฌ๊ฒ ๋๋ ๊ตฌ์กฐ์
๋๋ค. ์๋ฌผ์ ์์ญ์ ๋ฒ์ด๋ ๋ถ๋ถ์ ์๋ ์ด์ ์ ํ๊ณผ ๋๊ธฐ๋ ์๋ฌผ์ ๋ฅผ ์ฌ๋ ๋ฐ ์ํฅ์ ์ฃผ์ง ์์ง๋ง, ์๋ฌผ์ ์์ญ ๋ด์์๋ ์ด์ ์ ๋๊ธฐ ๋ถ๋ถ๊ณผ ์๋ฌผ์ ์ ํ ๋ถ๋ถ์ด ์ ํํ ์ผ์นํด์ผ ํ๋ฉฐ ์ด์ ์ ๋๊ธฐ์ ์๋ฌผ์ ์ ๋๊ธฐ๊ฐ ๋ง๋์๋ ์๋ฉ๋๋ค. ๋ํ ์๋ฌผ์ ์ ๋ชจ๋ ํ์ ์ฑ์ ๋น์ด์๋ ๊ณณ์ด ์์ด์ผ ์๋ฌผ์ ๋ฅผ ์ด ์ ์์ต๋๋ค.
์ด์ ๋ฅผ ๋ํ๋ด๋ 2์ฐจ์ ๋ฐฐ์ด key์ ์๋ฌผ์ ๋ฅผ ๋ํ๋ด๋ 2์ฐจ์ ๋ฐฐ์ด lock์ด ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ์ด์ ๋ก ์๋ฌผ์ ๋ฅผ ์ด์ ์์ผ๋ฉด true๋ฅผ, ์ด ์ ์์ผ๋ฉด false๋ฅผ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ ํ์ฌํญ
key๋ M x M(3 ≤ M ≤ 20, M์ ์์ฐ์)ํฌ๊ธฐ 2์ฐจ์ ๋ฐฐ์ด์
๋๋ค.
lock์ N x N(3 ≤ N ≤ 20, N์ ์์ฐ์)ํฌ๊ธฐ 2์ฐจ์ ๋ฐฐ์ด์
๋๋ค.
M์ ํญ์ N ์ดํ์
๋๋ค.
key์ lock์ ์์๋ 0 ๋๋ 1๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
0์ ํ ๋ถ๋ถ, 1์ ๋๊ธฐ ๋ถ๋ถ์ ๋ํ๋
๋๋ค.
์ ์ถ๋ ฅ ์
| [[0, 0, 0], [1, 0, 0], [0, 1, 1]] | [[1, 1, 1], [1, 1, 0], [1, 0, 1]] | true |
โ๏ธ ํ์ด
ํค๋ฅผ ์ด๋ป๊ฒ ๋ผ์ฐ๋ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ํ์ํด์ผ ๊ฒ ๋ค๊ณ ์๊ฐํด์ ์์ ํ์์ผ๋ก ๋ฌธ์ ๋ฅผ ํ์๋ค.
ํค๋ 360๋ ํ์ ํด์ ๋ผ์ธ ์ ์๊ธฐ ๋๋ฌธ์ ํค๋ฅผ ํ์ ํ๋ ํจ์๋ฅผ ๋ณ๋๋ก ์์ฑํ๋ค.

const rotate = key => {
const rotatedKey = [...Array(m)].map(_ => new Array());
for (let i = 0; i < m; i++) {
for (let j = m - 1; j >= 0; j--) rotatedKey[i].push(key[j][i]);
}
return rotatedKey;
};
์๊ณ๋ฐฉํฅ์ผ๋ก 90๋ ํ์ ์ํค๋ ํจ์์ด๋ค.
์ด๋ ๊ฒ ๋ฐํ๋ ์ด์ฐจ์ ๋ฐฐ์ด(key)๋ฅผ ์๋ฌผ์ ์ ์ด๊ณณ์ ๊ณณ ๋ง์ถฐ๋ด์ผ ํ๋ค. ๊ทธ๋ฆผ์ผ๋ก ๋ณด๋ฉด ์ดํดํ๊ธฐ ์ฝ๋ค.

์ด ์ธ์๋ ๋ ๋ง์ ๊ฒฝ์ฐ๊ฐ ์กด์ฌํ๋๋ฐ ํค๊ฐ ์๋ฌผ์ ์ ๊ฒน์น๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ (์๋ฌผ์ ์ ํฌ๊ธฐ + ํค์ ํฌ๊ธฐ - 1)^2๊ฐ ๋๋ค. ๋ฐ๋ผ์ ํ์ ๋ ํค๋ฅผ ๊ฐ๊ฐ ๋ฐ๋ณต๋ฌธ์ ํตํด ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ํ์ํ๋ค. ์๋ฌผ์ ๋ฅผ ํ ์ ์๋์ง๋ฅผ ํ์ธํ ๋์๋ ์๋ฌผ์ ์ ๊ธธ์ด๋งํผ ๋ฐ๋ณต๋ฌธ์ ๋๋ฉด์ ํค์ ๊ฒน์น๋ ์์น๋ผ๋ฉด ํด๋น ์์น๋ ์๋ก ๋ฌ๋ผ์ผ ํ๊ณ (ํ์ด ์๊ณ , ์๊ณ ) ๊ฒน์น์ง ์๊ณ ์๋ฌผ์ ๋ง ์๋ ๊ฒฝ์ฐ ํ์ด ํ์ ธ์์ผ๋ฉด ์๋๋ค.
const checkKey = (x, y, checkKey) => {
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
if (i - x < 0 || i - x >= m || j - y < 0 || j - y >= m) {
// key๊ฐ ์๋ ๋ถ๋ถ
if (!lock[i][j]) return false;
} else {
// key๊ฐ ์๋ ๋ถ๋ถ
if (lock[i][j] === checkKey[i - x][j - y]) return false;
}
}
}
return true;
};
๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ํ์ํ๋ฉฐ ํ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ๋ฉด ๋ฐ๋ก true๋ฅผ ๋ฐํํ๊ณ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ํ์ํ์์๋ true๊ฐ ๋ฐํ๋์ง ์์ผ๋ฉด(๋ง๋ ๊ฒฝ์ฐ๊ฐ ์์ผ๋ฉด) false๋ฅผ ๋ฐํํ๋ฉฐ ๋ฌธ์ ๋ฅผ ํ์๋ค.
โจ๏ธ ์ฝ๋
function solution(key, lock) {
const m = key.length;
const n = lock.length;
// key ํ์
const rotate = key => {
const len = key.length;
const rotateKey = [...Array(len)].map(_ => new Array());
for (let i = 0; i < len; i++) {
for (let j = 0; j < len; j++) rotateKey[i].push(key[j][i]);
rotateKey[i].reverse();
}
return rotateKey;
};
// key ํ์ธ
const checkKey = (x, y, checkKey) => {
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
if (i - x < 0 || i - x >= m || j - y < 0 || j - y >= m) {
// key๊ฐ ์๋ ๋ถ๋ถ
if (!lock[i][j]) return false;
} else {
// key๊ฐ ์๋ ๋ถ๋ถ
if (lock[i][j] && checkKey[i - x][j - y]) return false;
if (!lock[i][j] && !checkKey[i - x][j - y]) return false;
}
}
}
return true;
};
// ๋ชจ๋ ๋ถ๋ถ ํ์ธ
for (let k = 0; k < 4; k++) {
key = rotate(key);
for (let i = -m; i < n; i++) {
for (let j = -m; j < n; j++) {
const check = checkKey(i, j, key);
if (check) return true;
}
}
}
return false;
}'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Algorithm] ์นด์ดํธ๋ค์ด (0) | 2023.04.26 |
|---|---|
| [Algorithm] ์ถ์ต ์ ์ (0) | 2023.04.24 |
| [Algorithm] ์นด๋ ๋ญ์น (0) | 2023.04.23 |
| [Algorithm] ์ซ์ ์ง๊ฟ (0) | 2023.04.23 |
| [Algorithm] ์น์์ด(2) (1) | 2023.04.22 |