๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜/์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๋ฌธ์ œํ’€์ด

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค-60059]์ž๋ฌผ์‡ ์™€ ์—ด์‡ 

by alswlfl 2026. 6. 29.

[์‹œ๋ฎฌ๋ ˆ์ด์…˜]-์ž๋ฌผ์‡ ์™€ ์—ด์‡ 

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

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์˜ ๋Œ๊ธฐ ๋ถ€๋ถ„์„ ๋ผ์›Œ๋ณด๋ฉฐ ์กฐ๊ฑด์— ๋งŒ์กฑํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ ‘๊ทผํ•จ

  1. Lock์˜ ํ™ˆ ๋ถ€๋ถ„(0) ์ฐพ์•„ ๋ฐฐ์—ด ์ƒ์„ฑ
  2. Key์˜ ๋Œ๊ธฐ ๋ถ€๋ถ„(1) ์ฐพ์•„ ๋ฐฐ์—ด ์ƒ์„ฑ
  3. Key์˜ ๋Œ๊ธฐ ์œ„์น˜๋“ค์„ ์ˆœํšŒํ•˜๋ฉด์„œ Lock์˜ ์ฒซ ๋ฒˆ์งธ ํ™ˆ ๋ถ€๋ถ„์— ๋งž์ถ”๊ธฐ
  4. Key ๋Œ๊ธฐ ์œ„์น˜๋“ค์„ Lock์˜ ์ฒซ ๋ฒˆ์งธ ํ™ˆ ๋ถ€๋ถ„์— ๋งž๊ฒŒ ์œ„์น˜ ์ˆ˜์ •ํ•˜๊ธฐ
  5. ์œ„์น˜ ๋ณ€๊ฒฝ ํ›„ Key ๋Œ๊ธฐ ์œ„์น˜๋“ค์ด ์กฐ๊ฑด์— ์œ„๋ฐฐ๋˜๋Š”์ง€ ํ™•์ธ
    • ์œ„์น˜๊ฐ€ ์ž๋ฌผ์‡ ์˜ ์˜์—ญ์„ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒฝ์šฐ → ์ž๋ฌผ์‡  ์—ฌ๋Š”๋ฐ ์˜ํ–ฅ X(๋ฌด์‹œ)
    • key์˜ ์œ„์น˜๊ฐ€ ์ž๋ฌผ์‡ ์˜ ๋Œ๊ธฐ(1) ๋ถ€๋ถ„์ธ ๊ฒฝ์šฐ → ์ง€๊ธˆ๊นŒ์ง€ ์กฐ๊ฑด์— ๋งŒ์กฑํ•˜๋Š”๊ฑฐ ๋ฌดํšจํ™”์‹œํ‚ค๊ธฐ(ํšŒ์ „์‹œํ‚ค๊ธฐ)
    • key์˜ ์œ„์น˜๊ฐ€ ์ž๋ฌผ์‡ ์˜ ํ™ˆ(0) ๋ถ€๋ถ„์ธ ๊ฒฝ์šฐ → ์กฐ๊ฑด์— ๋งŒ์กฑํ•˜๋Š” ์ž๋ฌผ์‡ ์˜ ํ™ˆ ๋ถ€๋ถ„ ์นด์šดํŠธ ์ฆ๊ฐ€
  6. ์ž๋ฌผ์‡ ์˜ ๋ชจ๋“  ํ™ˆ์„ ๋‹ค ์ฑ„์šด ๊ฒฝ์šฐ ๋ฐ”๋กœ true ๋ฆฌํ„ด
  7. ์ถฉ๋Œํ•˜๊ฑฐ๋‚˜ ์ž๋ฌผ์‡ ์˜ ๋ชจ๋“  ํ™ˆ์„ ์ฑ„์šฐ์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ 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;
}