알고리즘 정리
[이것이 코딩테스트다] 다이나믹 프로그래밍(DP) 문제 - 바닥 공사
조조링
2025. 2. 19. 14:59
728x90
반응형
문제
가로의 길이가 N, 세로의 길이가 2인 직사각형 형태의 얇은 바닥이 있다. 태일이는 이 얇은 바닥을 1x2의 덮개, 2x1의 덮개, 2x2의 덮개를 이용해 채우고자 한다.
이때 바닥을 채우는 모든 경우의 수를 구하는 프로그램을 작성하시오. 예를 들어 2x3 크기의 바닥을 채우는 경우의 수는 5가지이다.
입력 조건
- 첫째 줄에 N이 주어진다. (1<=N<=1,000)
출력 조건
- 첫째 줄에 2xN 크기의 바닥을 채우는 방법의 수를 796,796으로 나눈 나머지를 출력한다.
입력 예시
3
출력 예시
5
문제 풀이
이 문제는 작은 문제를 활용해 큰 문제를 해결할 수 있는 전형적인 DP 문제이다.
마지막에 어떤 덮개를 추가하냐에 따라 점화식을 도출할 수 있다.
- 마지막에 1x2 타일을 추가하는 경우: dp[n-1]개의 경우에서 1x2 타일 1개 추가 가능 → dp[n-1]
- 마지막에 2x1 타일 2개 또는 2x2 타일을 추가하는 경우: dp[n-2]개의 경우에서 2가지 경우 가능 → dp[n-2] * 2
따라서, 점화식은 다음과 같다.
$dp[n] = dp[n-1] + dp[n-2] * 2$
- 초기 조건
> dp[1] = 1
> dp[2] = 3
전체 코드
import sys
def tiling(n):
dp = [0] * (n + 1) # DP 테이블 초기화
dp[1] = 1
if n > 1:
dp[2] = 3 # N=2일 때 직접 계산
for i in range(3, n + 1): # 3부터 N까지 채우기
dp[i] = (dp[i - 1] + dp[i - 2] * 2) % 796796 # 나머지 연산 적용
return dp[n]
# 입력 받기
n = int(sys.stdin.readline().strip())
print(tiling(n))
728x90
반응형