반응형
문제: https://www.acmicpc.net/problem/11726
문제 설명
더보기
문제
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
...
이와 같이 증가하여 피보나치 수열과 같은 규칙으로 증가한다는 것을 알 수 있습니다. 이를 이용하여 바텀업 방식으로 해결하면 빠른 속도로 해결할 수 있습니다.
반응형
'알고리즘 > 백준' 카테고리의 다른 글
백준 1463번 - 1로 만들기 / Python (0) | 2021.09.16 |
---|---|
백준 1149번 - RGB거리 / Python (0) | 2021.09.15 |
백준 9095번 - 1, 2, 3 더하기 / Python (0) | 2021.09.15 |
백준 2559번 - 수열 / Python (0) | 2021.09.14 |
백준 3020번 - 개똥벌레 / Python (0) | 2021.09.14 |