공부 일지/알고리즘

[알고리즘] 동적프로그래밍(DP)

Joshbla 2022. 7. 14. 15:38

동적 프로그래밍

동적 프로그래밍(Dynamic Programming)이란?

문제의 크기를 변화하면서 정답을 계산하는데,
작은 문제의 결과를 이용해서 큰 문제의 정답을 빠르게 계산하는 알고리즘

쉽게 말하면 답의 재활용, 또는 기억하며 풀기 라고 할 수있겠다.

 

답을 구하기 위해서 했던 계산을 반복해야하는 종류의 문제의 구조를 '최적 부분 구조'라고 부른다.

동적 프로그래밍은 이런 문제에서 큰 효과를 발휘한다.

ex. 피보나치 수열

 

피보나치 수열을 통해 동적 프로그래밍의 형태를 보면

 

Top-down 방식

피보나치 수열을 구하는 함수 fib()

fib(1) = fib(2) =  1

fib(N) = fib(N-1) + fib(N-2)

6번째 피보나치 수열을 구하면

fib(6)

= fib(5) + fib(4)

= fib(4) + fib(3) + fib(3) + fib(2)

= fib(3) + fib(2) + fib(2) + fib(1) + fib(2) + fib(1) + fib(2)

= fib(2) + fib(1) + fib(2) + fib(2) + fib(1) + fib(2) + fib(1) + fib(2)

이런 과정을 거친다.

 

Bottom-up 방식

피보나치 수열을 저장하는 배열  fib[]

fib[1] = fib[2] = 1

fib[N] = fib[N-1] + fib[N-2]

 

6번째 피보나치 수열을 구하면fib[1] = fib[2] = 1fib[3] = fib[1] + fib[2]fib[4] = fib[2] + fib[3]fib[5] = fib[3] + fib[4]fib[6] = fib[4] + fib[5]

이런 과정을 거친다.

이 방식을 쓰면 O(n)의 시간 복잡도로 구할 수 있다.

 

동적프로그래밍을 선택하는 과정 
1. 가장먼저 완전탐색 접근을 시도해본다.
2. 경우가 지나치게 많아서 안될 것 같다.
3. 이럴 때 모든 경우를 빠르게 탐색하는 방법으로 동적프로그래밍을 사용해본다.

 

 

[ 알고리즘과 문법을 공부한 내용을 정리해보는 공간입니다. 부족한 부분이나 잘못된 부분 지적해주시면 감사하겠습니다.]