[백준] 11726번 - 2xN 타일링

[백준] 11726번 - 2xN 타일링

Tags
Coding Test

문제

💡
2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오.
아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다.
notion image
시간 제한: 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; }