728x90
안녕하세요. 매일공부하는 개발자 빅광스입니다.
오늘은 다이나믹 프로그래밍의 문제를 풀어보도록 하겠습니다.
https://www.acmicpc.net/problem/11726
문제
2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오.
아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다.
입력
첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000)
출력
첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다.
예제 입력 1
2
예제 출력 1
2
예제 입력 2
9
예제 출력 2
55
해당 문제는 점화식으로 문제를 해결 할 수 있습니다.
- 2*1 타일의 경우의 수는 1가지, f(1) = 1
- 2*2 타일의 경우의 수는 2가지, f(2) = 2
- 2*3타일의 경우의 수는 f(3) = f(2)+f(1) 입니다.
- 2*3의 경우 f(1)에서 세로로된 타일 2개를 옆에 붙힙니다, f(2)에다가 가로로된 타일2개를 옆에 붙힙니다.
위의 사진과 같은 상황으로 f(3)은 만들어 집니다.
따라서 점화식을 f(n) = f(n-1) + f(n-2)로 만들 수 있습니다.
다음은 파이썬으로 코드를 작성해보겠습니다.
dp[1] 과 d[2]를 미리 값을 지정해준뒤 값을 계산하여 dp에 누적하여 계산해주고 값을 Return 해줍니다.
이렇게 하면 f(9), f(8)를 계산할때 쓰이는 서브프라블럼들을 미리 계산해두어 시간복잡도를 줄 일 수 있습니다.
n = int(input())
dp = [0] * (1000+1)
dp[1] = 1
dp[2] = 2
def f(n):
if(dp[n] != 0):
return dp[n]
else:
dp[n] = f(n-1) + f(n-2)
return dp[n]
print(f(n)%10007)
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 3109번 : 빵집 (0) | 2023.07.02 |
---|---|
[백준] 1700번 : 멀티탭 스케줄링 (2) | 2023.06.26 |
[백준] 2579번 : 계단오르기 (0) | 2023.06.24 |
[백준] 1149번 : RGB거리 (0) | 2023.06.22 |
[백준] 1339번 : 단어수학 (2) | 2023.06.19 |