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

Chobbyยท2022๋…„ 9์›” 26์ผ
1

Programmers

๋ชฉ๋ก ๋ณด๊ธฐ
43/345

ํ•ด๋‹น ๊ฒŒ์‹œ๋ฌผ์€ ๋‹ต์ˆ˜๋‹˜์˜ tistory ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์ž‘์„ฑ๋˜์—ˆ์Œ์„ ๋ฏธ๋ฆฌ ๋ฐํž™๋‹ˆ๋‹ค.

๐Ÿ˜ฃ๋ฌธ์ œ ์„ค๋ช…

๊ณ ๊ณ ํ•™์ž์ธ "ํŠœ๋ธŒ"๋Š” ๊ณ ๋Œ€ ์œ ์ ์ง€์—์„œ ๋ณด๋ฌผ๊ณผ ์œ ์ ์ด ๊ฐ€๋“ํ•  ๊ฒƒ์œผ๋กœ ์ถ”์ •๋˜๋Š” ๋น„๋ฐ€์˜ ๋ฌธ์„ ๋ฐœ๊ฒฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ฌธ์„ ์—ด๋ ค๊ณ  ์‚ดํŽด๋ณด๋‹ˆ ํŠน์ดํ•œ ํ˜•ํƒœ์˜ ์ž๋ฌผ์‡ ๋กœ ์ž ๊ฒจ ์žˆ์—ˆ๊ณ  ๋ฌธ ์•ž์—๋Š” ํŠน์ดํ•œ ํ˜•ํƒœ์˜ ์—ด์‡ ์™€ ํ•จ๊ป˜ ์ž๋ฌผ์‡ ๋ฅผ ํ‘ธ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค๋ช…ํ•ด ์ฃผ๋Š” ์ข…์ด๊ฐ€ ๋ฐœ๊ฒฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ž ๊ฒจ์žˆ๋Š” ์ž๋ฌผ์‡ ๋Š” ๊ฒฉ์ž ํ•œ ์นธ์˜ ํฌ๊ธฐ๊ฐ€ 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์€ ๋Œ๊ธฐ ๋ถ€๋ถ„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

๐Ÿค”์ž…์ถœ๋ ฅ ์˜ˆ

keylockresult
[[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];
            }
        }
profile
๋‚ด ์ง€์‹์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€๋‹ดํ•จ

0๊ฐœ์˜ ๋Œ“๊ธ€