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

Updated:

11726번 2xn 타일링

1. 문제 정보

백준 온라인 저지 [11726번 2xn 타일링] 문제의 링크입니다.

문제

2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오.

아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다.

12345

입력

첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000)

출력

첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다.


예제 입력1

2

예제 출력1

2

예제 입력2

9

예제 출력2

55

시간 / 메모리 제한

1초 / 256MB


2. 생각

  1. 2xn의 직사각형의 공간이 있을 때, 가장 오른쪽에 타일을 놓을 수 있는 방법은 총 2가지입니다.
    1. 하나는 이전에 만들어 놓은 타일(dp[n-1])의 경우에 각각 1x2 타일 한 개 놓는 방법입니다.
      1 ... n-1n
      dp[n-1]
    2. 다른 하나는 전전에 만들어 놓은 타일(dp[n-2])의 경우에 각각 2X1타일을 두 개 놓는 방법입니다.
      1 ... n-2n-1n
      dp[n-2]

    예) n이 5일 때, 타일을 채우는 예를 들어보겠습니다.

    n=3, 2X3을 채우는 경우 3가지

    123123123

    n=4, 2X4를 채우는 경우 5가지

    12341234123412341234

    1) n=5, 2X3을 채운 타일에 2X1 타일을 두 개 채우는 경우 3가지

    123451234512345

    2) n=5, 2X4를 채운 타일에 1X2 타일을 한 개 채우는 경우 5가지

    1234512345123451234512345

    따라서, 1)의 경우와 2)의 경우를 더한 8가지 경우가 n번째 타일을 채우는 경우의 수임을 알 수 있습니다.

  2. n번째의 경우를 구하기 위해 위의 두 가지의 경우를 모두 더합니다. 따라서 점화식 dp(n) = dp(n-1) + dp(n-2) 을 도출할 수 있습니다.

  3. n으로 입력받을 수 있는 최대 수는 1000이므로 int나 long long으로 표현할 수 있는 범위를 넘어가므로 10007로 나눈 나머지를 저장합니다.

3. 소스코드 (C++)


터미널의 입출력 화면 예제1

11726_1

터미널의 입출력 화면 예제2

11726_2 11726_3