이 문제는 그림을 그려보면 쉽게 해결할 수 있다.
먼저 N = 1 일때는 방법의 수는 1개이다. 2 x1 로 채울수 있는 방법은 세로 타일 하나만 가능하기 때문이다.
두 번째로 N = 2 일때는 2가지 방법이 있다. 가로 타일 2개 또는 세로 타일 2개
여기서 부터 중요하다.
N = 3 일 때를 살펴보면 N = 2 일때의 타일에 세로 타일을 하나 추가한 방법의 수 + N = 1 일때의 타일에 가로 타일 2개를 추가한 방법의 수를 합한 방법의 수와 같다.
다음으로 N = 4 일때를 살펴보면 동일하게 N = 3 일때의 방법의 수에 세로 타일을 하나 추가하 방법의 수 +
N = 2 일때의 방법의 수에 가로 타일 2개를 합한 방법의 수와 같다.
생각해보면 간단하다. N = 1[2 x 1 (가로1칸)] 일때 타일의 방법의 수는 가로 1칸을 채울 수 있는 방법 1개만 존재한다.
다음으로 N = 2[2 x 2(가로2칸)] 일때를 확인하면 가로 2칸을 채울 수 있는 세로타일 2개 또는 가로타일 2개이다.
N = 3 [2 x 3(가로3칸)] 일 때 가로 3칸을 채울 수 있는 방법을 생각해보면 N = 2 (가로2칸) 에 가로 1칸을 채울 수 있는 세로 타일을
붙이게 되면 [2 x 3]을 채울 수 있다. 또 다른 방법으로 [2 x 3] 칸을 채울 수 있는 방법은 N = 1일때 (가로1칸)을 가로 2칸을 채울 수 있는
가로 타일을 2개 붙이게 되면 [2 x 3] 을 채울 수 있다.
N = 4[2 x 4 (가로4칸)]도 위와 동일하게 N = 3 (가로3칸)에 가로 1칸을 채울 수 있는 세로 타입을 붙이게 되면 된다. 또 다른 방법으로는 N = 2(가로2칸)일 때에
가로 2칸을 채우면 [2 x 4] 를 채울 수 있다. 이러한 규칙을 보면 아래와 같은 점화식을 세울 수 있다.
T[N] = T[N - 1] + T[N - 2].
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static Integer[] dp;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
dp = new Integer[N + 1];
dp[0] = dp[1] = 1;
System.out.println(recur(N));
}
private static int recur(int n) {
if(dp[n] == null) {
dp[n] = (recur(n - 1) + recur(n - 2)) % 10007;
}
return dp[n];
}
}
static Integer[] dp;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
dp = new Integer[N + 1];
dp[0] = dp[1] = 1;
System.out.println(recur(N));
private static int recur(int n) {
if(dp[n] == null) {
dp[n] = (recur(n - 1) + recur(n - 2)) % 10007;
}
return dp[n];
}
이 문제도 dp[N]을 채우는 규칙을 찾아 넣는문제였다.
다시말해, N에 도달하기 위한 규칙을 찾는 문제였다.
이렇게 무언가 그림으로 해결할 수 있는 문제는 손으로 직접 그려가며 규칙을 찾아내는 것이 도움이된다.