정우는 예술적 감각이 뛰어난 타일공입니다. 그는 단순한 타일을 활용하여 불규칙하면서도 화려하게 타일링을 하곤 합니다.
어느 날 정우는 가로 길이 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];
}