문제
2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오.
아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다.
시간 제한: 1초
메모리 제한: 256MB
입력
첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000)
출력
첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다.
예제 입력 | 예제 출력 |
2 | 2 |
9 | 55 |
풀이
직사각형을 타일로 채우는 방법의 수를 표로 정리해 보면 다음과 같다.
ㅤ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
+ | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 | 55 |
위 표를 보면 피보나치 수열과 같은 것을 볼 수 있다. (dp[n] = dp[n-1] + dp[n-2])
이후 10,007로 모듈러 연산을 한 뒤 DP table에 저장하면 된다.
이전 값을 구해야 다음값을 구할 수 있으므로 바텀업 방식으로 구현하였다.
코드
#include <iostream> #include <vector> using namespace std; const int M = 10007; int main() { int n; cin >> n; vector<int> dp(n + 1); dp[0] = 1; dp[1] = 2; for (int i = 2; i < n ; ++i) { dp[i] = (dp[i - 1] % M + dp[i - 2] % M ) % M; } cout << dp[n - 1]; return 0; }