문제
2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오.
아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다.입력
첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000)
출력
첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다.
가로길이가 i인 경우에, (i - 1)타일에서 2x1 타일을 추가하면 되고, (i - 2) 타일은 (1x2)*2 타일을 추가하면 된다.
n = int(input())
d = [0] * (n + 2) # index error 조심
d[1] = 1
d[2] = 2
for i in range(3, n + 1):
d[i] = d[i - 2] + d[i - 1]
print(d[n] % 10007)
Index error 조심!!!
만약n = 1
인데,d = [0] * (n + 1)
이라면 index error가 발생한다
그렇기 때문데 d[2]를 만족할 수 있게(n + 1) -> (n + 2)
로 바꿔야 한다
이 경우 100% 갔다가 index error로 판정된다.. !
같은 유형의 다른 문제
n = int(input())
# 다이나믹 프로그래밍(왼쪽부터 채우자) - 보텀업
d = [0] * n # 앞서 계산된 결과 저장
d[0] = 1
d[1] = 3 # 2x2, (2x1)*2, (1x2)*2 3가지
for i in range(2, n):
d[i] = (d[i - 1] + d[i - 2] * 2) % 796796
# d[i - 1] 바로 전 타일을 가리키기 때문에, d[i]는 2x1 1가지 가능
# d[i - 2] 2x2를 만들어야 하므로, (1x2)*2, 2x2 2가지 가능
print(d[n - 1])