https://www.acmicpc.net/problem/9461
# 동적계획법
# T = the number of test case
# N = index
#변수 N을 입력받아 결과를 반환해주는 로직
def P(N):
array_memoization = [0] * (N + 1)
result = Dynamic_programming(array_memoization)[N]
return result
#동적계획법을 구현하는 로직
def Dynamic_programming(array_memoization):
i = 0
while i < (len(array_memoization)):
if i == 0:
array_memoization[i] = 0
elif i == 1:
array_memoization[i] = 1
elif i == 2:
array_memoization[i] = 1
elif i == 3:
array_memoization[i] = 1
elif i == 4:
array_memoization[i] = 2
else:
array_memoization[i] = array_memoization[i - 5] + array_memoization[i - 1]
i = i + 1
return array_memoization
print(P(6))
print(P(12))
https://coding-all.tistory.com/2
https://kamang-it.tistory.com/entry/AlgorithmDynamic-Programming%EB%8F%99%EC%A0%81%EA%B3%84%ED%9A%8D%EB%B2%95%EB%8B%A4%EC%9D%B4%EB%82%98%EB%AF%B9-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EA%B3%BC-%EB%A9%94%EB%AA%A8%EC%9D%B4%EC%A0%9C%EC%9D%B4%EC%85%98memoization-%ED%83%80%EB%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98tabulation
test cast 개수인 T를 길이로 하는 링크드리스트를 만들고 P(N)을 해당 리스트에 넣어 결과를 출력해본다
알고리즘을 구현하는데 너무 시간이 오래걸린다
다른 방향으로 생각하는 것도 중요하지만, 시간을 절약하는 것도 매우 중요하다.
10분내외로 생각하고 알고리즘 구현하는 것까지 가능하도록 꾸준히 연습해보자.
클린코드
하나의 코드에 모든 기능을 담지말고, 기능을 최대한 분산한다.
▶변수 N을 입력받아 결과를 반환해주는 로직
▶동적계획법을 구현하는 로직
가독성이 좋은 코드, 이해가 쉬운 코드의 조건들을 생각해보자.
동적계획법이란
큰 문제를 작은 문제로 나누어서 푼다
는 개념은 곧 "작은 답"들을 활용하여 "큰 문제"를 푼다
와 같다.
memoization
최종 큰 답을 구하는데 작은 답들을 저장
하고 활용하는 로직
동적계획법의 가장 중요한 개념!
TOP DOWN
, BOTTOM UP
모두 사용되는 개념!
TOP DOWN
최종단계의 답을 구하기위해 위(=최종단계)에서부터 내려오면서 저장한 값(=작은 답)을 활용하는 방식
ex
6번째 값을 구하기 위해 5,4,...하위단계의 값들중 필요한 값들을 구해나가며, 필요한 하위 단계 값들을 구했으면 로직 종료
BOTTOM UP / Tabulation
최종단계의 답을 구하기위해 처음부터 최종단계까지 모든 값들을 저장하면서 구해나가는 방식
ex
6번째 값을 구하기 위해 1,2,3,...하위단계부터 값들을 모두 구해 나간다.
코드에 대한 이해가 우선이다. sugar syntax보다는 sugar logic!