[ baekjoon ] 11726. 타일링

애이용·2021년 1월 11일
0

BOJ

목록 보기
10/58
post-thumbnail

문제

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로 판정된다.. !

같은 유형의 다른 문제

  • 2 x 2 타일 추가
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])
profile
로그를 남기자 〰️

0개의 댓글