알고리즘/백준
백준 11726번 - 2xn 타일링 / Python
Hwisaek
2021. 9. 15. 11:20
반응형
문제: https://www.acmicpc.net/problem/11726
11726번: 2×n 타일링
2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다.
www.acmicpc.net
문제 설명
더보기

문제
2 ×n 크기의 직사각형을 1 × 2, 2 ×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오.
아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다.

입력
첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000)
출력
첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다.
정답
n = int(input())
dp = [0] * (n + 1)
dp[0] = 1
dp[1] = 1
for i in range(2, n + 1):
dp[i] = dp[i - 1] + dp[i - 2]
print(dp[n] % 10007)
풀이
처음에는 모든 경우의 수를 계산하는 방식으로 문제에 접근했습니다.
import sys
sys.setrecursionlimit(15000)
n = int(input())
count = 0
def dp(n):
global count
if n == 0:
count += 1
return
elif n < 0:
return
dp(n - 1), dp(n - 2)
dp(n)
print(count % 10007)
그러나 이 코드를 이용하여 제출을 했을 때는 시간 초과가 발생하였습니다. 그래서 n이 1일 때부터 시작하여 적어보니 규칙을 찾을 수 있었습니다.
n = 1: 1
n = 2: 2
n = 3: 3
n = 4: 5
n = 6: 8
n = 7: 13
...
이와 같이 증가하여 피보나치 수열과 같은 규칙으로 증가한다는 것을 알 수 있습니다. 이를 이용하여 바텀업 방식으로 해결하면 빠른 속도로 해결할 수 있습니다.
반응형