문제
3×N 크기의 벽을 2×1, 1×2 크기의 타일로 채우는 경우의 수를 구해보자.
예제 입력 & 출력
입력
첫째 줄에 N(1 ≤ N ≤ 30)이 주어진다.
출력
첫째 줄에 경우의 수를 출력한다.
힌트
아래 그림은 3×12 벽을 타일로 채운 예시이다.
소스코드
기존에 타일 문제라고 생각하고, 간단히 생각했다가 바로 틀려버린 문제. 문제에 힌트가 있었던 이유가 있었다. DP 점화식을 만들기 위해 N=1, N=2...를 직접 만드는 과정에서 홀수의 경우 타일을 만들 수 없기 때문에 홀수 케이스의 경우 0으로 리턴하면 될 것이고, 짝수의 경우 N-2의 경우의 수 * 3만하면 끝나는 문제라고 생각했다.
힌트를 유심히 살펴보면, N=4의 경우 중간에 끼어있는 예외 케이스가 존재한다는 사실을 깨닫게 된다.
각 케이스에 우리가 예상한 케이스 + (전체 돌연변이 케이스)를 더해주면 총 경우의 수가 된다.
const fs = require('fs');
let n = fs.readFileSync('./dev/stdin').toString();
n = Number(n);
// n 홀수의 경우
// 경우의 수 0
if (n % 2 !== 0) return console.log(0);
const dp = new Array(n+1).fill(0);
dp[0] = 1;
dp[2] = 3;
for (let i = 4; i <= n; i+=2) {
dp[i] = dp[i-2] * 3;
for (let j = 4; j <= i; j+=2) {
dp[i] += dp[i-j] * 2;
}
}
console.log(dp[n]);
'Computer science > 알고리즘' 카테고리의 다른 글
[백준, node.js] 2004번 "조합 0의 개수" 문제 해결방법 (3) | 2022.02.13 |
---|---|
[백준, node.js] 11729번 "하노이 탑 이동 순서" 문제 해결방법 (0) | 2022.02.05 |
[백준, node.js] 9461번 "파도반 수열" 문제 해결방법 (0) | 2022.02.04 |
이진 탐색(Binary Search) 알고리즘 개념 이해 및 예제 feat. Javascript (0) | 2022.02.04 |
[백준, node.js] 2225번 "합분해" 문제 해결방법 (1) | 2022.02.03 |
이 포스팅은 쿠팡파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.