알고리즘 문제 풀이

76. C++ 백준 11726 번 2Xn 타일링 자세한 설명

코딩하는 덕구 🐶 2023. 1. 11. 16:25
728x90
반응형

안녕하세요 코딩하는 덕구입니다.

다이나믹 프로그래밍 문제인 C++ 백준 11726 번 2Xn 타일링 입니다.

https://www.acmicpc.net/problem/11726

 

11726번: 2×n 타일링

2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다.

www.acmicpc.net

 

백준 11726 C++ 정답 코드 입니다.

#include <iostream>
#define MAX 1001
using namespace std;
long long tiles[MAX] = {0, 1, 2,};
int cnt = 2;

int main(){
    int n;
    cin >> n;

    while ( cnt < n ){
        cnt++;
        tiles[cnt] = (tiles[cnt - 1] + tiles[cnt - 2]) % 10007;
    }

    cout << tiles[n];

    return 0;
}

 

먼저 타일을 2*n개의 직사각형에 배치하는 방법은 두 가지가 있습니다.

1) 1*2 타일을 넣는다

2) 2*2 타일을 넣는다.

왜 2*1 이 아닌 2*2 tile인지 궁금하실 텐데

어차피 2*1 타일을 위에 넣으면 아래에는 자동적으로 2*1 타일을 넣어야만 하기에

2*2타일이라고 생각해도 논리적으로 같습니다.

 

이제 2*n의 직사각형에 타일을 넣어봅시다.

 2*2의 직사각형에는 두 가지 방법이 있습니다.

1. 1*2 타일을 맨 뒤에 넣는다. | |

2. 2*2 타일을 맨 뒤에 넣는다. =

 

 2*3의 직사각형은 

2*3 직사각형에 맨 뒤에 2*1 타일이 들어가면

자연스럽게 남는 공간은 2*2 이 되므로  Base Case 2*2의 타일링 경우의 수를 더해주고 (n-1) 이미 저장되어 있음

 

2*3 직사각형에 맨 뒤에 2*2 타일이 들어가면

자연스럽게 남는 공간은 2*1 이 되므로 Base Case 2*1 의 타일링 경우의 수를  더해주면 (n-2) 이미 저장되어 있음

2*3직사각형의 타일링 경우의 수가 완성이 됩니다.

 

2*4의 직사각형은

2*4 직사각형에 맨 뒤에 2*1 타일이 들어가면

자연스럽게 남는 공간은 2*3 이 되므로  앞서 구한 2*3의 타일링 경우의 수를 더해주고 (n-1) 방금 구함

 

2*4 직사각형에 맨 뒤에 2*2 타일이 들어가면

자연스럽게 남는 공간은 2*2 이 되므로 Base Case 2*2 의 타일링 경우의 수를  더해주면 (n-2) 이미 저장되어 있음

 

즉 사전에 구한 (n-1) + (n-2) 의 타일링 경우의 수가 n 번째 타일링 경우의 수가 됩니다.

 

결국

(n-1) + (n-2) 을 더해서 n번을 구하는 코드입니다.

리스트인 tile 안에 0, 1, 2번은 Base Case로 넣었고

 

입력 값이 행렬 안에 있는지 검사한 후

만약 없다면

while ( cnt < n )

 

없는 부분을 계산해서 문제에서 요구한 저장 방식인 10007로 나눈 나머지 값을 넣어주었습니다.

while ( cnt < n ){
    cnt++;
    tiles[cnt] = (tiles[cnt - 1] + tiles[cnt - 2]) % 10007;
}

 

그리고 n번째 값을 출력하면 됩니다.

cout << tiles[n];

 

백준 11726 C++ 최종 코드 입니다.

#include <iostream>
#define MAX 1001
using namespace std;
long long tiles[MAX] = {0, 1, 2,};
int cnt = 2;

int main(){
    int n;
    cin >> n;

    while ( cnt < n ){
        cnt++;
        tiles[cnt] = (tiles[cnt - 1] + tiles[cnt - 2]) % 10007;
    }

    cout << tiles[n];

    return 0;
}

 

C++ 백준 11726 자세한 설명과 함께 정답 코드이었습니다.

 

감사합니다.

728x90
반응형