2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오.
아래 그림은 2×17 직사각형을 채운 한가지 예이다.
첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000)
첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다.
디피 문제는 풀 땐 너무 어렵고 생각하기가 힘든데 풀고 나면 세상 간단하다,, 점화식을 생각해내기가 힘들어서 그런 것 같다 ㅠ
import java.util.Scanner;
// 2*n 타일링 2
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] dp = new int[10001];
dp[1] = 1; // 2*1 일때
dp[2] = 3; // 2*2 일때
System.out.println(tile(dp, n) % 10007);
}
public static int tile(int[] dp, int n) {
if (dp[n] != 0) {
return dp[n];
} else {
// | 와 = 와 ㅁ 이 앞에 온 경우로 나눠서 생각할 수 있다
// | 가 앞에 온 경우 n-1의 경우의 수
// = 가 앞에 온 경우 n-2의 경우의 수
// ㅁ 이 앞에 온 경우 n-2의 경우의 수
dp[n] = tile(dp, n - 1) % 10007 + tile(dp, n - 2) % 10007 + tile(dp, n - 2) % 10007;
return dp[n];
}
}
}