타일을 이용하여, 주어진 크기의 직사각형을 채울 수 있는 모든 경우의 수를 고려하는 문제다.
- 이러한 유형의 문제는 규칙을 찾아 답을 찾는
dynamic programming
에 해당할 것 같아, 규칙 탐색- 그 결과,
2*n
크기를 갖는 직사각형을 채움에 있어,n
번째 블록은n-2
블록에 사용된 타일 수 * 2와n-1
블록에 사용된 타일 수가 필요- 알아낸 규칙을 기반으로 코드 작성
2*1
,2*2
,2*3
인 경우는 리스트 상에서 미리 정의
import sys
input = sys.stdin.readline
n = int(input())
num_list = [0 for _ in range(1001)] # n이 최대 1000
num_list[0] = 1 # 2*1
num_list[1] = 3 # 2*2
num_list[2] = 5 # 2*3
for i in range(3, n+1):
num_list[i]= (num_list[i-2] * 2) + num_list[i-1]
print(num_list[n-1]%10007)
첫 시도에서 런타임 에러가 발생했는데,
num_list = [0 for _ in range(n+1)]
위와 같이 코드를 작성했을 때, 런타임 에러가 발생했다.
n
이 1일 때 리스트 인덱스를 고려하지 못해 발생했다.
(코드에서 num_list[2] 범위까지 값을 할당하기 때문에)
이후 n
의 최대 범위인 1000에 1을 더한 1001을 할당하여 문제를 해결했다.