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

입력
첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000)
출력
첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다.
11726번: 2×n 타일링
2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다.
www.acmicpc.net
문제풀이
2×n 크기의 직사각형을 1 × 2, 2 × 1 타일로 채우는 방법의 수를 구하는 프로그램을 작성해야 한다.
우선, 길이가 n이라는 직사각형이 있을 때 피보나치와 유사한 형태의 식이 세워지는 것을 알 수 있다.
n = 1 : 1, n = 2 : 2, n = 3 : 3, n = 4 : 5, n = 5 : 8
n의 방법의 수는 n-1 + n-2라고 볼 수 있다. 즉, dp[n] = dp[n-1] + dp[n+1]이다.
방법 1. 전체 값을 구한 후 출력
import sys
input = sys.stdin.readline
n = int(input())
dp = [0] * 1001
dp[1], dp[2] = 1, 2
for i in range(3, 1001):
dp[i] = dp[i-1] + dp[i-2]
print(dp[n] % 10007)
- 1 <= n <= 1000 범위이므로 1001만큼 만든다.
- dp[1]과 dp[2]의 초깃값을 설정하고 이후 1000번까지 결과를 저장한다.
- dp[n] % 10007 결과를 출력한다.
방법 2. n번까지의 값을 구한 후 출력
import sys
input = sys.stdin.readline
n = int(input())
dp = [0] * (n+1)
if n < 3:
print(n % 10007)
else:
dp[1], dp[2] = 1, 2
for i in range(3, n+1):
dp[i] = dp[i-1] + dp[i-2]
print(dp[n] % 10007)
- n이 3 미만일 경우, print(n % 10007)로 결과를 화면에 바로 출력한다.
- n이 3 이상인 경우, dp[1]과 dp[2]를 초깃값을 설정한다.
- n번까지 결과를 저장한다.
- dp[n] % 10007 결과를 출력한다.
방법 3. dfs를 이용
import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**6)
def dfs(num):
if arr[num] > 0:
return arr[num]
if num == 1:
return 1
elif num == 2:
return 2
else:
arr[num] = dfs(num-1) + dfs(num-2)
return arr[num]
n = int(input())
arr = [0] * (n+1)
print(dfs(n) % 10007)
- 재귀 함수의 경우, 깊이 제한이 있어(기본 설정 1000회) Recursion Error가 날 수 있다. (나처럼 ^^;)
- sys.setrecursionlimit(10**6)를 추가하도록 한다.
- 참고로 PyPy를 사용할 경우 sys.setrecursionlimit()으로 임의로 재귀의 최대 깊이를 설정할 수 없다.
시간 차이가 좀 날 줄 알았는데, 역시 비슷하다 !
728x90
반응형
'프로그래밍 > Python' 카테고리의 다른 글
[백준/21918] 전구 - 파이썬(Python) (0) | 2022.03.27 |
---|---|
[백준/11057] 오르막 수 - 파이썬(Python) (0) | 2022.03.23 |
[백준/2579] 계단 오르기 - 파이썬(Python) (0) | 2022.03.22 |
[백준/9095] 1, 2, 3 더하기 - 파이썬(Python) (0) | 2022.03.22 |
[백준 / 1916] 최소비용 구하기 - 파이썬(Python) (0) | 2022.03.21 |
댓글