[์๋ฎฌ๋ ์ด์ ]-์๋ฌผ์ ์ ์ด์
ํ๋ก๊ทธ๋๋จธ์ค
SW๊ฐ๋ฐ์๋ฅผ ์ํ ํ๊ฐ, ๊ต์ก์ Total Solution์ ์ ๊ณตํ๋ ๊ฐ๋ฐ์ ์ฑ์ฅ์ ์ํ ๋ฒ ์ด์ค์บ ํ
programmers.co.kr
๋ฌธ์ ์ค๋ช
NxN ํฌ๊ธฐ์ ์ ์ฌ๊ฐ ๊ฒฉ์์ ํํ์ธ ์๋ฌผ์ ์ MxM ํฌ๊ธฐ์ธ ์ ์ฌ๊ฐ ๊ฒฉ์ ํํ์ ์ด์ ๊ฐ ์กด์ฌํ๋ฉฐ, ์๋ฌผ์ ์ ์ด์ ์๋ ํ๊ณผ ๋๊ธฐ ๋ถ๋ถ์ด ์กด์ฌํ๋ค.
์ด์ ๋ ํ์ ๊ณผ ์ด๋์ด ๊ฐ๋ฅํ๋ฉฐ, ์ด์ ์ ๋๊ธฐ ๋ถ๋ถ์ ์๋ฌผ์ ์ ํ ๋ถ๋ถ์ ๋ฑ ๋ง๊ฒ ์ฑ์ฐ๋ฉด ์๋ฌผ์ ๊ฐ ์ด๋ฆฐ๋ค.
- ์๋ฌผ์ ์์ญ์ ๋ฒ์ด๋ ๋ถ๋ถ์ ์๋ ์ด์ ์ ํ๊ณผ ๋๊ธฐ๋ ์๋ฌผ์ ๋ฅผ ์ฌ๋๋ฐ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
- ์๋ฌผ์ ์์ญ ๋ด์์๋ ์ด์ ์ ๋๊ธฐ ๋ถ๋ถ๊ณผ ์๋ฌผ์ ์ ํ ๋ถ๋ถ์ด ์ ํํ ์ผ์นํด์ผ ํ๋ค. ๋ํ ์ด์ ์ ๋๊ธฐ์ ์๋ฌผ์ ์ ๋๊ธฐ๊ฐ ๋ง๋์๋ ์๋๋ค.
- ์๋ฌผ์ ์ ๋ชจ๋ ํ์ ์ฑ์ ๋น์์๋ ๊ณณ์ด ์์ด์ผ ์๋ฌผ์ ๋ฅผ ์ด ์ ์๋ค.
์ ํ์ฌํญ
- 3 <= M <= 20
- 3 <= N <= 20
- M <= N
- key์ lock์ ์์๋ 0 ๋๋ 1๋ก ์ด๋ฃจ์ด์ ธ ์์(0: ํ ๋ถ๋ถ, 1: ๋๊ธฐ ๋ถ๋ถ)
์ ์ถ๋ ฅ ์์
| key | lock | result |
| [[0, 0, 0], [1, 0, 0], [0, 1, 1]] | [[1, 1, 1], [1, 1, 0], [1, 0, 1]] | true |
ํ์ด ๋ฐฉ๋ฒ
Lock์ ์ฒซ ๋ฒ์งธ ํ ๋ถ๋ถ์ ์ฐพ์ Key์ ๋๊ธฐ ๋ถ๋ถ์ ๋ผ์๋ณด๋ฉฐ ์กฐ๊ฑด์ ๋ง์กฑํ๋์ง ํ์ธํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ ๊ทผํจ
- Lock์ ํ ๋ถ๋ถ(0) ์ฐพ์ ๋ฐฐ์ด ์์ฑ
- Key์ ๋๊ธฐ ๋ถ๋ถ(1) ์ฐพ์ ๋ฐฐ์ด ์์ฑ
- Key์ ๋๊ธฐ ์์น๋ค์ ์ํํ๋ฉด์ Lock์ ์ฒซ ๋ฒ์งธ ํ ๋ถ๋ถ์ ๋ง์ถ๊ธฐ
- Key ๋๊ธฐ ์์น๋ค์ Lock์ ์ฒซ ๋ฒ์งธ ํ ๋ถ๋ถ์ ๋ง๊ฒ ์์น ์์ ํ๊ธฐ
- ์์น ๋ณ๊ฒฝ ํ Key ๋๊ธฐ ์์น๋ค์ด ์กฐ๊ฑด์ ์๋ฐฐ๋๋์ง ํ์ธ
- ์์น๊ฐ ์๋ฌผ์ ์ ์์ญ์ ๋ฒ์ด๋๋ ๊ฒฝ์ฐ → ์๋ฌผ์ ์ฌ๋๋ฐ ์ํฅ X(๋ฌด์)
- key์ ์์น๊ฐ ์๋ฌผ์ ์ ๋๊ธฐ(1) ๋ถ๋ถ์ธ ๊ฒฝ์ฐ → ์ง๊ธ๊น์ง ์กฐ๊ฑด์ ๋ง์กฑํ๋๊ฑฐ ๋ฌดํจํ์ํค๊ธฐ(ํ์ ์ํค๊ธฐ)
- key์ ์์น๊ฐ ์๋ฌผ์ ์ ํ(0) ๋ถ๋ถ์ธ ๊ฒฝ์ฐ → ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์๋ฌผ์ ์ ํ ๋ถ๋ถ ์นด์ดํธ ์ฆ๊ฐ
- ์๋ฌผ์ ์ ๋ชจ๋ ํ์ ๋ค ์ฑ์ด ๊ฒฝ์ฐ ๋ฐ๋ก true ๋ฆฌํด
- ์ถฉ๋ํ๊ฑฐ๋ ์๋ฌผ์ ์ ๋ชจ๋ ํ์ ์ฑ์ฐ์ง ๋ชปํ ๊ฒฝ์ฐ 90๋ ํ์ ์ํ

ํ์ ํจ์
- ๊ธฐ์กด Key ๋ฐฐ์ด์ ๋ค ํ์ ์ํค์ง ์๊ณ , Key์ ๋๊ธฐ ๋ถ๋ถ์ ํด๋นํ๋ ์์น๋ง ํ์ ์ํค๊ธฐ
- 90๋ ํ์ : [ํ, ์ด] → [์ด, ๋ฐฐ์ดํฌ๊ธฐ-1-ํ]
๋์น ๋ถ๋ถ...
- ์กฐ๊ฑด๋ฌธ์ผ๋ก ์์ธ์ฒ๋ฆฌ ํด์ค์ผํจ..
- ์๋ฌผ์ ํ ๋ถ๋ถ > ์ด์ ๋๊ธฐ ๊ฐ์ → ๋ชจ๋ ํ์ ์ฑ์ฐ์ง ๋ชปํจ โบ ๋ฐ๋ก false ๋ฆฌํด
- ์๋ฌผ์ ๊ฐ ๋ชจ๋ ๋๊ธฐ์ธ ๊ฒฝ์ฐ, ์ฆ ์๋ฌผ์ ํ ๋ถ๋ถ=0 → ๋ชจ๋ ํ์ด ๋ค ์ฑ์์ง โบ ๋ฐ๋ก true ๋ฆฌํด
์ฝ๋
function solution(key, lock) {
const m = key.length; // ์ด์ ํฌ๊ธฐ
const n = lock.length; // ์๋ฌผ์ ํฌ๊ธฐ
const lockHome = []; // ์๋ฌผ์ ์ ์ฒ์์ผ๋ก ๋์ค๋ ํ ์์น ์ฐพ๊ธฐ
for(let r=0; r<n; r++) {
for(let c=0; c<n; c++) {
if(lock[r][c] === 0) lockHome.push([r, c]);
}
}
const keyNotHome = []; // ์ด์ ์ ๋๊ธฐ ์์น ํ์ธ
for(let r=0; r<m; r++) {
for(let c=0; c<m; c++) {
if(key[r][c] === 1) keyNotHome.push([r, c]);
}
}
if(lockHome.length > keyNotHome.length) return false; // ์๋ฌผ์ ํ ๊ฐ์ > ์ด์ ๋๊ธฐ ๊ฐ์ -> ์ด ์ ์์
else if(lockHome.length === 0) return true; // ๋ฌด์กฐ๊ฑด ์ด ์ ์์
for(let k=0; k<keyNotHome.length; k++) {
let origin = [...keyNotHome];
// 0๋, 90๋, 180๋, 270๋
for(let i=0; i<4; i++) {
// ์๋ฌผ์ ์ ์ฒซ ๋ฒ์งธ ํ์ด๋ ์ด์ ๋๊ธฐ๋ ์์น ๋ง์ถ๊ธฐ
const moveR = lockHome[0][0]-origin[k][0];
const moveC = lockHome[0][1]-origin[k][1];
const posKey = origin.map((pos) => [pos[0]+moveR, pos[1]+moveC]);
let find = 0;
for(const [pr, pc] of posKey) {
if(pr < 0 || pr >= n || pc <0 || pc >= n) continue; // ๋ฒ์ ๋ฒ์ด๋๋๊ฑด ๋ฌด์
// ์๋ฌผ์ ๋ ์ด์ ๊ฐ ์ถฉ๋ํ๋ ๊ฒฝ์ฐ ๋ค์ ํ์ ์ํ
if(lock[pr][pc] === 1) {
find = 0;
break;
} else {
find++;
}
}
if(find === lockHome.length) return true; // ์๋ฌผ์ ์ ๋ชจ๋ ํ๊ณผ ๋ง์ ๊ฒฝ์ฐ
else {
origin = rotate(origin, m);
}
}
}
return false;
}
// ํ์
function rotate(key, m) {
// 1ํ -> 3์ด, 2ํ -> 2์ด, 3ํ -> 1์ด
const rotateKey = [];
for(const [r, c] of key) {
rotateKey.push([c, m-1-r]);
}
return rotateKey;
}
'์๊ณ ๋ฆฌ์ฆ > ์ฝ๋ฉํ ์คํธ ๋ฌธ์ ํ์ด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [SWEA-2001] ํ๋ฆฌ ํด์น (0) | 2026.06.23 |
|---|---|
| [ํ๋ก๊ทธ๋๋จธ์ค-12907] ๊ฑฐ์ค๋ฆ๋ (0) | 2026.06.17 |
| [ํ๋ก๊ทธ๋๋จธ์ค-258711] ๋๋๊ณผ ๋ง๋ ๊ทธ๋ํ (0) | 2026.05.27 |
| [ํ๋ก๊ทธ๋๋จธ์ค-49191] ์์ (0) | 2026.05.17 |
| [ํ๋ก๊ทธ๋๋จธ์ค-1843] ์ฌ์น์ฐ์ฐ (0) | 2026.05.02 |