본문 바로가기

Study/Algorithm

[BOJ] 11727 - 2×n 타일링 2

[BOJ] 11727 - 2×n 타일링 2

문제

문제

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

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

입력

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

출력

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

예제 입력

2

예제 출력

3

문제 해결

지난 번에 풀어보았던 2×n 타일링과 유사하지만 생각해야하는 것이 한가지 더 있다. 2x2 타일이 추가되었다는 점이다. 이점을 유의해서 점화식을 세워보자

index 0 1 2 3 4 5
dp 0 0 0 0 0 0

index 가 1인 경우는 2x1 하나를 놓는 경우 1가지 이다.

index가 1인 경우

if i == 1 :
    arr[i] = 1

index 가 2인 경우는 2x1 타일 두개를 겹쳐 놓는 경우 2가지와 2x2 타일을 놓는 경우 1가지 그래서 총 3가지이다.

index가 2인 경우

elif i == 2 :
    arr[i] = 3

index 가 3 이상인 경우는 dp[3-1] 경우에 2x1 타일을 붙이는 경우와 dp[2-1] 에 2x1 타일 2개를 가로로 붙인 경우, 2x2 타일을 붙인 경우가 있다. 2x1 타일을 세로로 붙이면 안되는 이유는 지난 2xn 타일 붙이기 포스팅에 그림으로 설명되어 있다.

index가 3 이상인 경우

else :
    arr[i] = arr[i-1] + arr[i-2] * 2

코드를 작성해 보자.

python 코드

n = int(input())
arr = [0] * (n+1)
for i in range(1, n+1):
    if i == 1 :
        arr[i] = 1
    elif i == 2 :
        arr[i] = 3
    else :
        arr[i] = arr[i-1] + arr[i-2] * 2

print(arr[n] % 10007)

Test Case

45665
3559
------------------------
65704
9180
------------------------
25088
8817
------------------------
35023
3338
------------------------
60442
6144
------------------------

느낀점

화이팅

'Study > Algorithm' 카테고리의 다른 글

[BOJ] 1912 - 연속합  (2) 2019.04.25
[BOJ] 11053 - 가장 긴 증가하는 부분 수열  (1) 2019.04.25
[BOJ] 2156 - 포도주 시식  (0) 2019.04.25
[BOJ] 1932 - 정수 삼각형  (2) 2019.04.22
[BOJ] 2193 - 이친수  (0) 2019.04.22