동적 프로그래밍(Dynamic Programming)이란?
by 코딩무비동적 프로그래밍(Dynamic Programming)
주어진 문제를 여러 개의 하위 문제(subproblem)로 나누어 푼 다음, 그것을 결합하여 해결하는 알고리즘
- 메모리 공간을 약간 더 사용하여 연삭 속도를 비약적으로 증가
- 하위문제들의 수가 기하급수적으로 늘어날 경우 유리한 알고리즘
- 큰 문제를 작은 문제로 나눌 수 있다.
- 작은 문제에서 구한 정답은 그것을 포함하는 큰 문제에서도 동일하다.
- 메모라이제이션(Memorization)을 사용하여 작은 문제에서 구한 정답을 저장
동적 프로그래밍 vs 분할 정복
- 문제를 잘게 쪼게어 작은 단위로 분할
- 동적 프로그래밍
- SubProblem는 중복되어 상위 문제 해결시 사용
- Memorization 사용
- 상향식 접근(bottom up)
- 분할 정복
- SubProblem은 중복되지 않음
- 하향식 접근(top down)
ex) 피보나치수열
1. 분할 정복(Divide & conquer)
<출처 : https://stevenschmatz.github.io/blog/2017/12/06/introduction-to-dynamic-programming/>
분할 정복에서 이용한 풀이에서 불필요한 중복된 연산을 계속 수행하여 실행시간이 오래 걸리는 것을 알 수 있다.
# 분할 정복
def fibo(n):
if n <= 1:
return n
return fibo(n-1) + fibo(n-2)
2. 동적 프로그래밍(Dynamic Programming)
<출처 : https://stevenschmatz.github.io/blog/2017/12/06/introduction-to-dynamic-programming/>
메모라이제이션을 이용하여 불필요한 중복된 연산을 수행하지 않는 것을 확인할 수 있다.
# 동적 프로그래밍(dp)
def fibo(n):
dp = [0 for _ in range(n+1)]
dp[0] = 0
dp[1] = 1
for i in range(2,n+1):
dp[i] = dp[i-1] + dp[i-2]
return dp[n]
Reference
관련문제 풀이 포스팅
[백준] 12865번 평범한 배낭(python 파이썬)
저번 시간에 배운 동적 프로그래밍 관련 문제를 하나 풀어보겠습니다! 문제 12865번: 평범한 배낭 첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두
codingmovie.tistory.com
[백준]11049번 행렬 곱셈 순서(python 파이썬)
저번 풀이에 이어 dp의 대표적인 문제를 하나 풀어보겠습니다! 참고로 pypy3으로 제출해야 합니다! 문제 11049번: 행렬 곱셈 순서 첫째 줄에 입력으로 주어진 행렬을 곱하는데 필요한 곱셈 연산의
codingmovie.tistory.com
출처
이것이 취업을 위한 코딩 테스트다 with 파이썬
잘못된 내용이 있으면 피드백 부탁드립니다!
궁금한 내용이 있으면 언제든지 물어보세요!!!
'알고리즘' 카테고리의 다른 글
[알고리즘] 이진 탐색 심화(lower bound, upper bound) (3) | 2022.04.21 |
---|---|
[알고리즘] 이진 탐색(Binary Search) (17) | 2022.04.20 |
[알고리즘] 정렬 (5) | 2022.03.28 |
[알고리즘] BFS & DFS (4) | 2022.03.14 |
[알고리즘] 구현 (2) | 2022.03.14 |
블로그의 정보
코딩무비
코딩무비