알고리즘/백준

백준 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
...

 이와 같이 증가하여 피보나치 수열과 같은 규칙으로 증가한다는 것을 알 수 있습니다. 이를 이용하여 바텀업 방식으로 해결하면 빠른 속도로 해결할 수 있습니다.

반응형