Algorithm/DailyCoding

[23.02.27] Daily Coding 25 - tiling

Dong _ hwa 2023. 5. 19. 00:23
  1. tiling
    ์„ธ๋กœ ๊ธธ์ด 2, ๊ฐ€๋กœ ๊ธธ์ด n์ธ 2 x n ๋ณด๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 2 x 1 ํฌ๊ธฐ์˜ ํƒ€์ผ์„ ๊ฐ€์ง€๊ณ  ์ด ๋ณด๋“œ๋ฅผ ์ฑ„์šฐ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฐ ๊ฒฝ์šฐ์˜ ์ˆ˜ ๋ฌธ์ œ๋Š” ์ผ๋‹จ ์ž‘์€ ์ˆ˜๋ฅผ ์†์ˆ˜ ๊ณ„์‚ฐํ•ด์„œ ๊ทœ์น™์„ ์ฐพ์•„๊ฐ€๋Š” ๊ฒƒ์ด ๋น ๋ฅด๋‹ค.

๋ชจ์•„๋†“๊ณ  ๋ณด๋‹ˆ ๊ทœ์น™์„ฑ์ด ๋ณด์ธ๋‹ค

n=1 -> 1
n=2 -> 2
n=3 -> 3
n=4 -> 5
n=5 -> 8
...

์„ธ๋กœ์˜ ๊ธธ์ด๋Š” ๊ณ ์ •๋œ ์ฑ„๋กœ ๊ฐ€๋กœ์˜ ๊ธธ์ด๋งŒ ๋Š˜์–ด๋‚œ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—,
์ชผ๊ฐœ์–ด์„œ ์ƒ๊ฐํ•˜๋ฉด ํŽธ๋ฆฌํ•˜๋‹ค.
๊ฒฐ๊ตญ ํ•œ ์นธ์„ ์ฐจ์ง€ํ•˜๋Š” 2x1์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋ชจ์–‘์ด ๋ฐ”๋กœ ์ „ (n-1)๊ณผ ๊ฐ™๊ณ , ๋‘ ์นธ์„ ์ฐจ์ง€ํ•˜๋Š” ์ตœ์†Œ 2x2๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋ชจ์–‘์ด (n-2)์™€ ๊ฐ™๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
์ฆ‰ ํ”ผ๋ณด๋‚˜์น˜์™€ ์™„์ „ ์œ ์‚ฌํ•œ ์ˆ˜์—ด์ด ๋˜๋Š” ๊ฒƒ.

๋‹จ์ˆœํ•œ ์žฌ๊ท€๋กœ ๋‚˜ํƒ€๋‚ด์–ด ๋ณด๋ฉด

let tiling = function (n) {
  if (n <= 2) return n;
  return tiling(n - 2) + tiling(n - 1);
};

์ด๋ ‡๊ฒŒ ๋˜๋‚˜, ์ด๋Ÿฌ๋ฉด ์ €๋ฒˆ ํ”ผ๋ณด๋‚˜์น˜์—์„œ ๋ฐฐ์šด ๊ฒƒ์ฒ˜๋Ÿผ ๋ชจ๋“  ํƒ€์ผ์„ ๋‹ค ์ˆœํšŒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค.(ํ”ผ๋ณด๋‚˜์น˜,์‹œ๊ฐ„๋ณต์žก๋„ ์ค„์ด๊ธฐ ์ฐธ๊ณ )

๋‚ด๊ฐ€ ์“ด ๋‹ต

let tiling = function (n) {

  let arr = [0,1,2];

  const boxTiling = (n) => {
    if(arr[n]) return arr[n];
    return arr[n] = boxTiling(n-1) + boxTiling(n-2);
  } 

  return boxTiling(n);
};

๋ ˆํผ๋Ÿฐ์Šค์™€๋Š” ์กฐ๊ธˆ ์ฐจ์ด๊ฐ€ ์žˆ์—ˆ๋‹ค.
๋‚˜๋Š” ์ด๋ฏธ ํ•ด๊ฒฐํ•œ ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” ์‹์ด์—ˆ๋˜ ๊ฑธ๊นŒ..

๋ ˆํผ๋Ÿฐ์Šค 1 (memoization)

let tiling = function (n) {
  // ์ธ๋ฑ์Šค๋ฅผ ์ง๊ด€์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด
  // ์•ž ๋ถ€๋ถ„์„ ์˜๋ฏธ์—†๋Š” ๋ฐ์ดํ„ฐ(dummy)๋กœ ์ฑ„์šด๋‹ค.
  const memo = [0, 1, 2];

  // ์žฌ๊ท€๋ฅผ ์œ„ํ•œ ๋ณด์กฐ ํ•จ์ˆ˜(auxiliary function)์„ ์„ ์–ธ)
  const aux = (size) => {
    // ์ด๋ฏธ ํ•ด๊ฒฐํ•œ ๋ฌธ์ œ๋Š” ํ’€์ง€ ์•Š๋Š”๋‹ค.
    if (memo[size] !== undefined) return memo[size];
    if (size <= 2) return memo[n];
    memo[size] = aux(size - 1) + aux(size - 2);
    return memo[size];
  };
  return aux(n);
};

๋ ˆํผ๋Ÿฐ์Šค 2 (tabulation)

let tiling = function (n) {
  const memo = [0, 1, 2];
  if (n <= 2) return memo[n];
  for (let size = 3; size <= n; size++) {
    memo[size] = memo[size - 1] + memo[size - 2];
  }
  return memo[n];
};

๋ ˆํผ๋Ÿฐ์Šค 3 (slicing window)

let tiling = function (n) {
  let fst = 1,
    snd = 2;
  if (n <= 2) return n;
  for (let size = 3; size <= n; size++) {
    // ์•ž์˜ ๋‘ ์ˆ˜๋ฅผ ๋”ํ•ด ๋‹ค์Œ ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.
    const next = fst + snd;
    // ๋‹ค์Œ ๋ฌธ์ œ๋กœ ๋„˜์–ด๊ฐ€๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ 2๊ฐœ์˜ ๋ฐ์ดํ„ฐ์˜ ์ˆœ์„œ๋ฅผ ์ •๋ฆฌํ•œ๋‹ค.
    fst = snd;
    snd = next;
  }
  return snd;
};

https://school.programmers.co.kr/learn/courses/30/lessons/12900

ํ•˜์ง€๋งŒ!
์ด ์„ธ ๊ฐ€์ง€ ๋ชจ๋‘ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N) ์ธ๋ฐ...
๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์— ์ด ๋ ˆํผ๋Ÿฐ์Šค๋กœ ์ž…๋ ฅํ–ˆ์„ ๋•Œ
๊ทธ๋ƒฅ ์ „๋ถ€ ์‹คํŒจ๊ฐ€ ๋œฌ๋‹ค ^^7 ๋‹ต์ด๋ผ๋„ ๋งž๊ฒŒ ํ•ด์ค˜๋ผ

๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๋งŽ์•„ ์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ 1,000,000,007์œผ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ returnํ•ด๋‹ฌ๋ผ๊ณ  ํ•˜์—ฌ ๊ทธ๋ ‡๊ฒŒ ํ•ด๋„...

memo์— ํ•จ์ˆ˜๊ฐ’์„ ์ €์žฅํ•  ๋•Œ ๋‚˜๋จธ์ง€ ์—ฐ์‚ฐ(%1000000007)์„ ์ˆ˜ํ–‰ํ•ด์ฃผ์–ด๋„.. ๋ช‡ ๊ฐ€์ง€ ๋ถ€๋ถ„์—์„œ ํƒˆ๋ฝํ•œ๋‹ค. ใ…  ใ… 


ํšจ์œจ์„ฑ์ด 30์  ์ค‘ 5์ ์ž„.. ใ… 





programmers ํ’€์ด

function solution(n) {  
  const memo = [0, 1, 2];
  for (let size = 3; size <= n; size++) {
    memo[size] = (memo[size - 1] + memo[size - 2])  % 1000000007;
  }
  return memo[n];
}

์šฐ์—ฌ๊ณก์ ˆ ๋์— ์™„์„ฑํ•œ ํ’€์ด...