728x90
DP, Dynaminc Programming
동적 계획법
피보나치 수열
Fibonacci numbers
모든 항은 바로 앞 두 항의 합인 수열
1, 1, 2, 3, 5, 8, ...
📄 피보나치 수열-재귀함수
input = 20
def fibo_recursion(n):
if(n<3):
return 1
else:
return fibo_recursion(n-2) + fibo_recursion(n-1)
print(fibo_recursion(input)) # 6765
하지만, n에 100을 넣으면 값이 나오는데 엄청난 시간이 걸림.
이유? 연산량이 많기 때문
그렇기 때문에 여태까지 했던 연산 결과를 기록해 다시 활용할 수 있는 DP 개념이 생김!!!
동적 계획법(Dynamic Programming)이란?
복잡한 문제를 간단한 여러 개의 문제로 나누어 푸는 방법
부분 문제 반복과 최적 부분 구조를 가지고 일반적인 방법에 비해
더욱 적은 시간 내에 문제를 풀 수 있는 방법
📌 Memoization
결과를 기록하는 것
📌 Overlapping Subproblem
문제를 쪼갤 수 있는 구조, 겹치는 부분 문제
📌 피보나치 수열-DP 구현 방법
1. 메모용 데이터를 만든다. 처음 값인 Fibo(1), Fibo(2) 는 각각 1씩 넣어서 저장해둔다.
2. Fibo(n) 을 구할 때 만약 메모에 그 값이 있다면 바로 반환한다.
3. Fibo(n) 을 처음 구했다면 메모에 그 값을 기록한다.
memo = {
1: 1, # Fibo(1)의 값을 기록
2: 1, # Fibo(2)의 값을 기록
}
📄 피보나치 수열-DP
Top Down 방식 이용.
Fifo(100) → Fifo(99) → Fifo(98) → ...
input = 100
# memo 라는 변수에 Fibo(1)과 Fibo(2) 값을 저장해놨습니다!
memo = {
1: 1,
2: 1
}
# 1. 만약 메모에 있으면 그 값을 바로 반환하고
# 2. 없으면 아까 수식대로 구한다
# 3. 그리고 그 값을 다시 메모에 기록한다.
def fibo_dynamic_programming(n, fibo_memo):
if(n in fibo_memo.keys()):
return memo[n]
else:
fibo_memo[n] = fibo_dynamic_programming(n-1, fibo_memo) + fibo_dynamic_programming(n-2, fibo_memo)
return fibo_memo[n]
print(fibo_dynamic_programming(input, memo))
'알고리즘' 카테고리의 다른 글
데일리 알고리즘 230119 (0) | 2023.01.19 |
---|---|
데일리 알고리즘 230118 (0) | 2023.01.18 |
데일리 알고리즘 230117 (0) | 2023.01.17 |
데일리 알고리즘 230116 (0) | 2023.01.16 |
데일리 알고리즘 230113 (0) | 2023.01.13 |