2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오.
첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000)
첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다.
위의 그림을 보면 n값에 1이 더해질때 경우의 수는 마지막의 타일이 세로로 놓일경우와(n-1) 가로로 놓일경우(n-2) 두가지를 더한 값이다.
세로로 들어갈 경우 전체 가로 길이는 n-1
로 dp[n-1]
의 값과 같고,
가로로 들어갈 경우 전체 가로 길이는 n-2
로 dp[n-2]
의 값과 같아진다.
dp[ n ] = dp[ n - 1 ] + dp[ n - 2 ]
var fs = require('fs');
let n = +fs.readFileSync('./input.txt').toString().trim();
const dp = Array(n + 1).fill(0);
dp[1] = 1;
dp[2] = 2;
function solution() {
for (let i = 3; i < dp.length; i++) {
dp[i] = (dp[i - 1] + dp[i - 2]) % 10007;
//마지막 값에 10007을 나눠주면 너무 큰 값을 계산하게 되면서 오류가 나게 되서 미리 1007을 나눈다.
}
console.log(dp[n]);
}
solution();