[이코테] 다이나믹 프로그래밍_바닥 공사 (python)

juyeon·2022년 7월 6일
0

문제

: 가로 n 세로 2 길이의 바닥을 타일로 채우려 한다.
타일은 3가지: 1x2, 2x1, 2x2
바닥을 채우는 경우의 수 % 796796 출력하시오

나의 풀이

1. 탑다운 방식(재귀 함수)

import sys
input = sys.stdin.readline
n = int(input())
# 타일길이가 n일때 index n까지 나타내기 위해
# 리스트의 길이를 n + 1까지 설정
d = [0] * (n + 1)
def bottom(x):
	# 타일 길이가 1, 2 일 때 값 설정
	d[1] = 1
	d[2] = 3
	
	# 이미 계산이 존재하는 경우, 그 값 반환
	if d[x] != 0:
		return d[x]
        
	# 타일 최대 길이가 2이기 때문에, 두가지 경우 존재
	# 길이가 1 남을땐 경우의 수 1,
	# 길이가 2 남을땐 경우의 수 2 -> 따라서 2를 곱함
	d[x] = bottom(x - 1) + (bottom(x - 2) * 2)
	return d[x]
    
# 796796을 나눈 나머지 값 출력
print(bottom(n) % 796796)

: d[x] = bottom(x - 1) + (bottom(x - 2) * 2)으로 수정! 자꾸만 재귀 함수를 헷갈려서 다른걸로 적어버린다 ㄷㄷ d[x-1]로 적을거면, 재귀 함수가 아니지~! 탑다운이 아니지~!

2. 바텀업 방식

import sys
input = sys.stdin.readline

n = int(input())

# 타일길이가 n일때 index n까지 나타내기 위해
# 리스트의 길이를 n + 1까지 설정
d = [0] * (n + 1)

# 타일 길이가 1, 2 일 때 값 설정
d[1] = 1
d[2] = 3

# index를 n까지 나타내기 위해 range를 n + 1까지 설정
for x in range(3, n + 1):
	# 타일 최대 길이가 2이기 때문에, 두가지 경우 존재
	# 길이가 1 남을땐 경우의 수 1,
	# 길이가 2 남을땐 경우의 수 2 -> 따라서 2를 곱함
	d[x] = d[x - 1] + (d[x - 2] * 2)
    
# 796796을 나눈 나머지 값 출력
print(d[n] % 796796)
profile
내 인생의 주연

0개의 댓글