최대 1 분 소요

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

문제 링크

성능 요약

메모리: 31120 KB, 시간: 40 ms

분류

다이나믹 프로그래밍

제출 일자

2024년 3월 27일 07:30:31

문제 설명

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

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

입력

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

출력

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

풀이

11726번 문제를 풀었다면 쉽게 풀 수 있는 문제라고 생각한다. 이번엔 1×2, 2×1에 2×2가 추가되었다. n이 2일 때, 방법의 수가 3이라면, n이 3일 때의 값은 어떨까? 11726번에서는 n-1의 방법의 수와 n-2의 방법의 수를 더한 값이 n의 방법의 수가 되었다. 아래 그림은 n=3일 때의 방법의 수를 그림으로 직접 나타낸 것이다.

식으로 나타내면 dp[n] = dp[n-1] + 2 * dp[n-2]이다. 즉, n-2의 방법의 수에 ×2를 해주고 n-1의 방법의 수에 더해주게된다.

전체코드

import sys

input = sys.stdin.readline

n = int(input())

dp = [0]*1001

dp[1] = 1
dp[2] = 3

for i in range(3, n+1):
    dp[i] = dp[i-1] + 2*dp[i-2]

print(dp[n]%10007)

댓글남기기