2×n 타일링 2
https://www.acmicpc.net/problem/11727
11727번: 2×n 타일링 2
2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×17 직사각형을 채운 한가지 예이다.
www.acmicpc.net
문제
2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오.
아래 그림은 2×17 직사각형을 채운 한가지 예이다.

입력
첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000)
출력
첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다.
예제 입력 1
2
예제 출력 1
3
예제 입력 2
8
예제 출력 2
171
예제 입력 3
12
예제 출력 3
2731
코드
n = int(input())
d = [0] * 1001
d[1] = 1
d[2] = 3
for i in range(3, n+1):
d[i] = d[i-1] + 2 * d[i-2]
print(d[n] % 10007)
풀이
위 문제는 동적계획법의 bottom-up 방식으로 풀 수 있다. 그 이유는 작은 문제를 풀어 그 값을 저장해 큰 문제에 활용할 수 있고, 초기값을 알 수 있기 때문이다.
우선, 2×n 직사각형을 채우는 방법의 수를 저장할 배열 d를 생성하고 0으로 초기화하여, 입력값의 최대 크기인 1001로 지정한다. 그리고, 초기값의 경우 d[1] = 1이고, d[2] = 3임을 쉽게 알 수 있으므로 지정해주도록 한다.
우선 점화식을 구하기 위해 n = 1, n = 2, n = 3, n = 4인 경우까지 구하고, d[i] = d[i-1] + 2 * d[i-2]임을 유도해내고, 예제 입력과 출력을 이용하여 구한 점화식이 맞는지 확인해주었다. 하지만 이 점화식이 구체적으로 어떻게 도출되었는지에 대한 확신이 없었기에 이 블로그(https://changsroad.tistory.com/104)를 참고하였고, 아래 나온 사진 모두 해당 블로그에서 가져왔다.
d[3]을 보면 d[2]에서 2*1의 타일만을 붙일 수 있고, d[1]에서는 1*2 타일 두 개, 2*2 타일 1개를 붙이는 2가지의 경우를 생각할 수 있으므로 2를 곱해주면 된다. 위 사진의 빨간색, 파란색 그림을 본다면 쉽게 이해할 수 있다.
'Python > Coding Test' 카테고리의 다른 글
[백준] 10844 : 쉬운 계단 수 (파이썬 / Python) (0) | 2023.07.13 |
---|---|
[백준] 9095 : 1, 2, 3 더하기 (파이썬 / Python) (0) | 2023.07.13 |
[백준] 11726 : 2×n 타일링 (파이썬 / Python) (0) | 2023.07.13 |
[백준] 1463 : 1로 만들기 (파이썬 / Python) (0) | 2023.07.13 |
[자료구조 알고리즘] Dynamic Programming (동적계획법) (0) | 2023.07.12 |