๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm

[Algorithm] ์ž๋ฌผ์‡ ์™€ ์—ด์‡ 

๐Ÿ“‹ ๋ฌธ์ œ

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

์ž ๊ฒจ์žˆ๋Š” ์ž๋ฌผ์‡ ๋Š” ๊ฒฉ์ž ํ•œ ์นธ์˜ ํฌ๊ธฐ๊ฐ€ 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