[프로그래머스] 아방가르드 타일링 (JavaScript)

Jake·2023년 4월 22일
0

문제 설명[링크]

정우는 예술적 감각이 뛰어난 타일공입니다. 그는 단순한 타일을 활용하여 불규칙하면서도 화려하게 타일링을 하곤 합니다.

어느 날 정우는 가로 길이 n, 세로 길이 3 인 판을 타일링하는 의뢰를 맡았습니다. 아방가르드한 디자인 영감이 떠오른 정우는 다음과 같은 두 가지 종류의 타일로 타일링을 하기로 결정했습니다.

각 타일은 90도씩 회전할 수 있으며 타일의 개수는 제한이 없습니다.

n이 주어졌을 때, 이 두 가지 종류의 타일로 n x 3 크기의 판을 타일링하는 방법의 수를 return 하도록 solution 함수를 완성해주세요.

풀이

function solution(n) {
  const DIVIDENUM = 1000000007;
  const dp = new Array(n + 1).fill(null);
  const cache = [8, 0, 2];

  dp[0] = 0;
  dp[1] = 1;
  dp[2] = 3;
  dp[3] = 10;

  for (let i = 4; i <= n; i += 1) {
    const remainder = i % 3;
    let sum = cache[remainder];
    const plus = i % 3 === 0 ? 4 : 2;

    sum += dp[i - 1] * 1;
    sum += dp[i - 2] * 2;
    sum += dp[i - 3] * 5;
    sum += plus;
    sum %= DIVIDENUM;

    cache[remainder] += dp[i - 1] * 2;
    cache[remainder] += dp[i - 2] * 2;
    cache[remainder] += dp[i - 3] * 4;
    cache[remainder] %= DIVIDENUM;

    dp[i] = sum;
  }

  return dp[n];
}

결과

0개의 댓글