본문 바로가기

Algorithm/Dynamic Programming

[백준] 2xn 타일링 11726번 - Python

문제

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

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

입력

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

출력

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


풀이

n=1 일 때, 1가지

n=2일 때, 2가지

n=3일 때, 3가지

n=4일 때,  5가지

n=5일 때,  8가지 ,,,

 

1 2 3 5 8 ... 로 방법의 수가 늘어나고

 

n=3일 때를

( n=2일 때 맨 오른쪽에 2x1의 블럭 1개가 들어가는 경우 ) + ( n=1일 때 오른쪽 2x2칸에 1x2블럭 2개가 들어가는 경우 )로 볼 수 있다.

 

n=4일 때를

( n=3일 때 맨 오른쪽에 2x1의 블럭이 들어가는 경우 ) + ( n=2일 때 오른쪽 2x2칸에 1x2블럭 2개가 들어가는 경우 )로 볼 수 있다.

 

n=5일 때를

( n=4일 때 맨 오른쪽에 2x1의 블럭이 들어가는 경우 ) + ( n=3일 때 오른쪽 2x2칸에 1x2블럭 2개가 들어가는 경우 )로 볼 수 있다.

...

 

따라서 DP[n] = DP[n-1] + DP[n-2] ( DP[1]=1, DP[2]=2)의 점화식을 찾을 수 있다.

 

import sys
input=sys.stdin.readline

n=int(input())

def Tiling_2xn(n):
    T=[0,1,2] + [0]*(n-2)
    for i in range(3, n+1): #3~n
        T[i]=T[i-1]+T[i-2]
    return T[n]

print(Tiling_2xn(n)%10007)