티스토리 뷰
알고리즘
- 다이나믹 프로그래밍
풀이
타일은 | 또는 ㅡ 같은 모양을 가진다.
직사각형 2*n에서 n이 하나 증가하면
- 열이 한칸 더 생기는 것으로 | 만큼이 더 생기게 된다. 그러므로 2*n-1을 채우는 방법에 | 을 붙여주면 된다.
이 외의 경우의 수가 하나 더있는데
- = 가로 두개가 마지막에 붙는 경우이다. 이 경우에는 2*n-2을 채우는 방법에 = 을 붙여주면 된다.
즉 직사각형 2*n을 채우는 방법의 수는 2*n-1을 채우는 방법의 수 + 2*n-2을 채우는 방법의 수가 된다.
벡터 dy를 이용하여 나타낼 수 있다.
- dy[1]은 | 로 채울 수 있는 방법이 하나이므로 1으로 초기화
- dy[2]는 || 또는 = 로 채울 수 있는 방법이 두가지이므로 2로 초기화 한다.
dy[1]=1
dy[2]=2
dy[n]=dy[n-1]+dy[n-2] (n>=3)
⚠️ 주의할 점
문제에서는 2*n 크기의 직사각형을 채우는 방법의 수를 10007로 나눈 나머지를 출력하도록 하고 있는데,
dy 값을 모두 구한 후 dy[n]%10007을 해주게 되면 오버플로우가 될 수 있어 예상과 다른 값이 나올 수 있다.
따라서 dy 배열의 값을 구하며 %10007을 해주어야 한다.
성공 코드
#include <bits/stdc++.h>
using namespace std;
int main() {
freopen("input.txt", "rt", stdin);
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
cin >> n;
vector<int> dy(n+1, 0);
dy[1]=1;
dy[2]=2;
for(int i=3; i<=n; i++){
// 오버플로우 일어날 수 있으므로 10007을 나눠서 저장해줘야 한다.
dy[i]=(dy[i-1]+dy[i-2])%10007;
}
cout << dy[n];
return 0;
}
'알고리즘' 카테고리의 다른 글
[백준 2579번/c++] 계단 오르기 (0) | 2022.08.10 |
---|---|
[백준 1149번/c++] RGB거리 (0) | 2022.08.10 |
[백준 3020번/c++] 개똥벌레 (0) | 2022.07.31 |
[백준 1931번/c++] 회의실 배정 (0) | 2022.07.24 |
[백준 10816번/c++] 숫자 카드 2 (0) | 2022.07.09 |