본문 바로가기
알고리즘/dynamic programming

[백준][Python] 11727번 2×n 타일링 2

by 임짠짠 2022. 5. 12.
반응형
 

11727번: 2×n 타일링 2

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

www.acmicpc.net

 

코드

n = int(input())
dp = [0]*(n+2)
dp[1] = 1
dp[2] = 3
for i in range(3,n+1):
    if i % 2 == 0:
        dp[i] = dp[i-2] * 4 - 1
    else:
        dp[i] = dp[i-2] * 4 + 1
        
print(dp[n] % 10007)

 

설명

규칙을 찾기가 되게 어려웠다.. 일단 그 전에 푼 2×n 타일링과 달리 2×2 타일이 추가되었기 때문에 n이 짝수일 때와 홀수일 때의 규칙이 따로따로 존재하겠다는 생각이 들었다. 그래서 n이 5일 때까지 값을 구해보니 

n = 1 -> 1
n = 2 -> 3
n = 3 -> 5
n = 4 -> 11
n = 5 -> 21

이렇게 나왔다. 이걸 보고

n이 홀수일 때 dp[i] = (dp[i-2] * 4) + 1

n이 짝수일 때 dp[i] = (dp[i-2] * 4) - 1

임을 알아냈다.

반응형

댓글