펭로그

[C++] 백준 BOJ 11726 2xn 타일링 / 11727 2xn 타일링 2 본문

Study/PS(Algorithm)

[C++] 백준 BOJ 11726 2xn 타일링 / 11727 2xn 타일링 2

노랑펭귄 2018. 9. 27. 17:16

문제링크 : https://boj.kr/11726


시뮬레이션을 해보면 아래 그림과 같이 규칙을 찾을 수 있다.

하나의 타일을 1*2로 고정 시키면 N-1의 모든 케이스를 적용할 수 있고

두개의 타일을 2*1 두개로 고정 시키면 N-2의 모든 케이스를 적용할 수 있다.


하지만, 여기서 신기한 점은 1, 2, 3, 5.... 피노나치 수열과 동일한 문제임을 알 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// BOJ 11726 2xn 타일링
#include <iostream>
 
using namespace std;
 
int dp[1001];
 
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    // freopen("../input.txt", "r", stdin);
    int num;
    cin >> num;
    dp[1= 1;
    dp[2= 2;
    for (int i = 3; i <= num; i++) {
        dp[i] = dp[i - 1+ dp[i - 2];
        if (dp[i] >= 10007)
            dp[i] %= 10007;
    }
    cout << dp[num];
 
    return 0;
}
cs



문제링크 : https://boj.kr/11727


11726 문제의 접근 방법과 동일하지만 조건이 1가지 추가되었다.

2*1을 2개 쌓은 것과 2*2 블럭 1개의 경우를 동일하게 생각하여 조건을 2배 해주면 너무 쉽게 풀린다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// BOJ 11726 2xn 타일링 2
#include <iostream>
 
using namespace std;
 
int dp[1001];
 
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    // freopen("../input.txt", "r", stdin);
    int num;
    cin >> num;
    dp[1= 1;
    dp[2= 2;
    for (int i = 3; i <= num; i++) {
        dp[i] = dp[i - 1+ dp[i - 2* 2;
        if (dp[i] >= 10007)
            dp[i] %= 10007;
    }
    cout << dp[num];
 
    return 0;
}
cs


'Study > PS(Algorithm)' 카테고리의 다른 글

[C++] 백준 BOJ 11403 경로 찾기  (0) 2018.10.02
[C++] 백준 BOJ 1759 암호 만들기  (0) 2018.10.01
[C++] 백준 BOJ 3048 개미  (0) 2018.09.21
[C++] 백준 BOJ 11559 Puyo Puyo  (0) 2018.09.20
[C++] 백준 BOJ 6359 만취한 상범  (0) 2018.09.20
Comments