[Silver III] 2×n 타일링 2 - 11727

문제 링크

성능 요약

메모리: 31256 KB, 시간: 60 ms

분류

다이나믹 프로그래밍

문제 설명

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

아래 그림은 2×17 직사각형을 채운 한가지 예이다.

입력

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

출력

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

코드

import sys

n = int(sys.stdin.readline())

dp = [0, 1, 3]

for i in range(3, n+1):
    if i % 2 == 0:
        dp.append(sum(dp) + 2)
    else:
        dp.append(sum(dp) + 1)

print(dp[n] % 10007)

코드 리뷰

이 문제는 2xn타일링과 마찬가지로 그림을 그려가며 규칙을 찾아야 풀 수 있는 문제인것 같다. 이걸 그림을 안그려보고 직관으로 풀 수 있는 사람이 있을지는 모르겠다. 모르겠으면 그려보자! 어쨋든 규칙은 짝수번째 개수는 그 전 모든 개수를 합한 것 + 2 이고, 홀수번째 개수는 그 전 모든 개수를 합한 것 + 1 이다.

댓글남기기