본문 바로가기
[알고리즘 + 자료구조]

[알고리즘] 동적계획법(2021.02.03수정) + 그리디 알고리즘 정리 1차 + (분할 vs 동적 )

by Hevton 2020. 12. 14.
반응형

 

동적계획법

 

- 동적 계획법은 최적 부분 구조(Optimal Substructure)를 지닌 중복된 하위 문제들(Overlapping Subproblems)을 분할 정복으로 풀이하는 문제해결 패러다임이다 ( 동적계획법의 사용 조건 : 최적 부분 구조 && 중복된 하위 문제들 )

 

- 쪼개지는 부분 문제가 중복될 때 메모이제이션을 사용하여 속도를 향상시키는 방법이다.

즉 하나의 문제가 부분 문제로 쪼개져서 푸는 문제에서, 같은 부분 문제들이 있다면 이들을 한 번만 실행하게끔만 구현해주는 것. (중복되는 문제에 대한 답을 여러 번 구할 필요가 없도록, 한 번 실행할 때 결과값을 캐시해놨다가 다음에 실행될 때는 캐시해놓은 값을 꺼내 쓰는것)

 

- 부분 문제로 쪼개서 원래의 답을 구한다는 점, 최적 부분 구조에서 사용된다는 점에서 분할정복과 비슷하나, 부분문제의 중복여부와 그로인한 메모이제이션 사용여부에 대한 차이가 있다.(즉, 동적계획법과 분할정복법의 차이점은 계산결과의 재활용 여부 )

 

- 대표적으로 피보나치 수열을 동적계획법으로 구현할 수 있다.

 

+ 동적계획법과 부분정복법 정리

공통점 : 모두 부분 문제로 쪼개서 원래의 답을 구하는 방식이며, 최적 부분 구조 기반에서 사용되나

차이점 : 부분 문제가 중복적이냐와 그로인해 메모이제이션을 사용하냐가 차이점이다.

 

+ 분할 정복 알고리즘은 문제를 나눌 수 없을 때 까지 나눠서 각각 문제를 풀면서 다시 합병하여 문제를 해결해가는 알고리즘

분할 정복의 대표적인 예시 : Quick Sort, Merge Sort
(2021.11.16)

 

 

+ 동적계획법에는 엄밀히 두 가지가 있다. (2021.01.01 수정)

 

[ Top - down ]

Top - down은 최종 함수에서 시작해서 재귀를 통해 끝까지 내려갔다가 다시 올라오는 resolve 방식이다.

재귀함수를 통한 구현. 반복되는 부분문제에 대한 재귀함수를 호출하는 수고를 덜기 위해서 메모이제이션을 사용한다.

[ Bottom - up ]

반복문을 통한 구현. 앞에서부터 차례차례 구해나가면서 최종값에 다다르는 방식. 그 자체로 메모이제이션이 내장된다고 생각하면 된다.

 

 

'재귀를 이용한 동적계획법'인 Top - bottom 방식에서 주로 '메모이제이션'이라는 표현을 쓰고, '반복문을 이용한 동적계획법'인 Bottom - up 에서는 메모이제이션이라는 표현을 쓰지 않는 것 같다.

 

하지만 Top - down에는 중복되는 부분문제들이 존재해서 메모이제이션을 사용하고, Bottom - up 에서는 중복되는 부분문제들이 존재하지 않아서 메모이제이션을 사용하지 않는다고 표현하는 게 아니다.

Top - down 방식으로 구현하나, Bottom - up 방식으로 구현하나 결국 과정에서 동일하게 반복되는 부분문제들이 존재한다.

(그러니 동적계획법 문제이기도 한 것)

 

차이점은 Top - down 방식에서 일반적인 재귀방식으로 이런 동일한 부분문제를 반복적으로 호출해야 하는 대신에 메모이제이션을 도입하여 중복부분문제(함수)를 캐싱하는 것이고, Bottom - up 방식은 아예 처음부터 메모이제이션이 내장되어 있다고 생각하면 된다.

 

Top - bottom ( 재귀 함수 흐름 )

fibo(4) = fibo(3) + fibo(2)

fibo(3) = fibo(2) + fibo(1)

fibo(2) = fibo(1) + fibo(0)

 

fibo(2) = fibo(1) + fibo(0) -> 메모이제이션 도입 시엔 이렇게 호출하지 않아도 됨

 

 

Bottom - up

fibo[2] = fibo[1] + fibo[0]

fibo[3] = fibo[2] + fibo[1]

fibo[4] = fibo[3] + fibo[2]

 

 

핵심은

메모이제이션 기반의 Top - Bottom = Bottom - up 이란 느낌이라는 것.

즉, Top - bottom 이나 Bottom - up이나 똑같은 문제에서는 중복되는 부분문제가 동일하게 존재하는건 변하지 않는 사실인데,

Top - Bottom 방식에서 메모이제이션을 구현함으로써 이런 중복되는 부분문제 '함수' 계산을 시행하지 않는 것이고

Bottom - Up은 아래에서 위로 올라가면서, 이미 그 자체만으로도 반복되는 부분문제들에 대한 메모이제이션을 진행하며 풀어나가게 된다. (이런 말을 응축하여 메모이제이션이라는 표현 대신 '타뷸레이션' 이라는 표현을 쓰는 것 같다)

 

Top - down은 resovle 방식인 탓에 큰 문제에서 내려갔다가 다시 올라오는 과정이므로 메모이제이션은 해당 결과 값이 필요해질 때 계산을 해서 저장을 하지만, Bottom - up은 아래에서 시작되므로 타뷸레이션은 필요하지 않은 값도 미리 계산해서 메모리에 저장해두는 차이점이 있다;

 

어쨌든 Top - down / Bottom - up을 이렇게 구분지어서 생각할 필요없이 동적계획법 적용 문제에선 중복되는 부분 문제 자체들이 존재하고, 이미 계산했던 결과를 이미 저장해놨어서 다시 계산하지 않는다는 개념에서 메모이제이션/타뷸레이션이라고 부른다.

 

Top - down이나 Bottom - up 이나 '반복되는 부분문제의 중복 실행 방지'라는 흐름에서, 메모이제이션/타뷸레이션 굳이 구분지을 필요 없이 개념적으로 메모이제이션이라고 이해해도 무방할 것 같다. (둘은 Bottom - up 식이냐 Top - down 식이냐의 차이지, 중복되는 문제를 저장한다는 개념의 의도는 동일하고, 그건 메모이제이션이다. 타뷸레이션은 거기서 bottom - up의 흐름이 응축된 단어)

 

이 내용 관련 참고

umbum.dev/770

 

Dynamic programming, 동적 계획법

피보나치 수열 구하기(그냥 일반항에 대입하면 나오기는 하지만) 처럼 최종 결과를 도출하기 위해서 이를 더 작은 단위의 문제로 나눠서 먼저 해결하고 그것을 조합하여 최종 문제를 해결하는

umbum.dev

infinitt.tistory.com/246

 

알고리즘 - 다이나믹 프로그래밍 (Dynamic Programming)

다이나믹 프로그래밍 (Dynamic Programming) : DP 개념 : 문제를 더 작은 단위로 쪼개어 해결하는 알고리즘. (분할 정복 알고리즘과 비슷하다. 차이점은 바로 아랫줄.) 핵심은, 그 작은 단위의 문제들이

infinitt.tistory.com

arincblossom.wordpress.com/2019/08/17/dynamic-programming-동적계획법/comment-page-1/

 

Dynamic Programming (동적계획법)

Dynamic Programming(동적계획법): 특정 범위까지의 결과값을 구하여 이를 이용해 더 큰 범위로 확장해가며 문제를 풀어나가는 알고리즘 기법이다 여기까지만 보면 Divide and Conquer(분할정복법)랑 다른

arincblossom.wordpress.com

kamang-it.tistory.com/entry/AlgorithmDynamic-Programming동적계획법다이나믹-프로그래밍과-메모이제이션memoization-타뷸레이션tabulation

 

[Algorithm][Dynamic Programming]동적계획법(다이나믹 프로그래밍)과 메모이제이션(memoization), 타뷸레이

여러분이 프로그램에게 일을 시키는 이유는 무엇일까? 정말 간단한데 "많은 작업을 시키거나 적은 작업을 여러번 반복하기"위해서이다. 결국에는 많이 시킨다는 것이다. 사람입장에서 덧셈을

kamang-it.tistory.com

namu.wiki/w/메모이제이션

 

메모이제이션 - 나무위키

이 저작물은 CC BY-NC-SA 2.0 KR에 따라 이용할 수 있습니다. (단, 라이선스가 명시된 일부 문서 및 삽화 제외) 기여하신 문서의 저작권은 각 기여자에게 있으며, 각 기여자는 기여하신 부분의 저작권

namu.wiki

 

 

 

 

 

전체 글 내용 관련 참고

galid1.tistory.com/507

 

알고리즘 - Dynamic Programming(동적프로그래밍)이란?

Dynamic Programming(동적계획법) 이란 1. Dynamic Programming(동적계획법)이란? 큰 문제를 작은문제로 나누어 푸는 문제를 일컫는 말입니다. 동적 계획법이란 말 때문에 어떤 부분에서 동적으로 프로그래

galid1.tistory.com

velog.io/@polynomeer/동적-계획법Dynamic-Programming

 

동적 계획법(Dynamic Programming)

동적 계획법(Dynamic Programming, DP)은 큰 문제를 작은 문제로 나누어서 푸는 방식의 알고리즘이다. 동적 계획법은 처음 주어진 문제를 더 작은 문제들로 나눈 뒤 각 조각의 답을 계산하고, 이 답들로

velog.io

chickenpaella.tistory.com/37

 

다이나믹 프로그래밍

다이나믹 프로그래밍은 “큰 문제를 작은 문제로 나누어 푸는 알고리즘”이다. 하지만 단순히 나누는 것이 다가 아니라, 두가지 조건을 만족해야만 다이나믹 프로그래밍으로 문제를 푼다고 할

chickenpaella.tistory.com

nsgg.tistory.com/33

(최적 부분 구조 설명)

 

[동적 계획법] Dynamic programming

동적 계획법이라는 말은 최적화 문제를 연구하는 수학 이론에서 왔다. 중복되는 부분 문제 없애 최적화하여 속도향상을 꾀하는 알고리즘 설계 기법이 바로 동적 계획법이다. 동적계획법은 분할

nsgg.tistory.com

doorbw.tistory.com/53

(최적 부분 구조 설명)

 

알고리즘 #7_ 동적 프로그래밍: 동적 프로그래밍의 요소

안녕하세요. 우리는 지난 포스팅들을 통해서 동적 프로그래밍(Dynamic programming)의 3가지 예시에 대해 살펴보았습니다. 이번 포스팅에서는 예시들과 같은 최적화 문제에 동적 프로그래밍을 적용하

doorbw.tistory.com

museop.github.io/computer%20algorithm/2017/08/13/Dynamic-Programming.html

(최적 부분 구조 설명)

 

동적 계획법(Dynamic Programming) · Pleasure of Learning

동적 계획법(Dynamic Programming) 13 Aug 2017 동적 계획법이란? 동적 계획법(dynamic programming)은 최적화 문제를 풀기 위해 고안된 기법으로 복잡한 문제를 보다 간단한 여러 개의 부분 문제로 나누어 해결

museop.github.io

hroad.tistory.com/46

(최적 부분 구조 설명)

 

[알고리즘] 동적 계획법 (Dynamic Programming)

동적 계획법 이란? 동적 계획법(動的計劃法, dynamic programming)이란 복잡한 문제를 간단한 여러 개의 문제로 나누어 푸는 방법을 말한다. 이것은 부분 문제 반복과 최적 부분 구조를 가지고 있는 알

hroad.tistory.com

codingsmu.tistory.com/15

 

[SW Expert Academy] 동적 계획법(Dynamic Programming)

(본 강의 노트는 SW Expert Academy의 Programming Advanced 강의를 기반으로 하고 있습니다) Dynamic Programming 1차시. 피보나치 수 1) 소개 피보나치 수열이란? : 0과 1로 시작하고 이전의 두 수의 합을 다음..

codingsmu.tistory.com

 

 

동적계획 vs 분할정복 비교 참고

euju-wouldyou.tistory.com/m/104?category=766590

 

다이나믹 프로그래밍(dynamic Programming)

출처:www.youtube.com/watch?v=5Lu34WIx2Us <다이나믹 프로그래밍> - 메모리를 적절히 사용하여 수행 시간 효율성을 비약적으로 향상시키는 방법 - 이미 계산된 결과(작은 문제)는 별도의 메모리 영역에 저

euju-wouldyou.tistory.com

freedeveloper.tistory.com/m/276

 

[이것이 코딩 테스트다] 6. 다이나믹 프로그래밍

www.youtube.com/watch?v=5Lu34WIx2Us&list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC&index=6 다이나믹 프로그래밍 다이나믹 프로그래밍은 동적 계획법이라고도 부른다 일반적인 프로그래밍 분야에서의 동적(Dynamic)..

freedeveloper.tistory.com

 

그리디 알고리즘

(최적 부분 구조를 가져야 그리디 알고리즘도 효과가 있다는 것)

velog.io/@cyranocoding/동적-계획법Dynamic-Programming과-탐욕법Greedy-Algorithm-3yjyoohia5

 

동적 계획법(Dynamic Programming)과 탐욕법(Greedy Algorithm)

0x1X28uI-8A6oGM7.jpeg가장 빨리 가는 길을 찾고 싶다. 한 가지 방법은 출발하기 전, 가는 거리와 신호등, 교통 상황 등을 전부 계산해서 최적의 길을 찾는 것이다. 머리가 깨질 듯이 전부 확인하고 길

velog.io

namu.wiki/w/그리디%20알고리즘

(그리디 알고리즘 & 최적 부분 구조 설명)

 

그리디 알고리즘 - 나무위키

그리디 알고리즘(욕심쟁이 알고리즘, Greedy Algorithm)이란 "매 선택에서 지금 이 순간 당장 최적인 답을 선택하여 적합한 결과를 도출하자" 라는 모토를 가지는 알고리즘 설계 기법이다. 예를 들어

namu.wiki

 

동적 계획법과 그리디 알고리즘의 차이

- 동적 계획법은 모든 경우를 따져본다(일반 재귀와 다른 점은 메모이제이션을 사용하여 시간을 줄이는 것)

- 그리디 알고리즘은 일단 지금 최적을 계속 쫓는다.

skmouse.tistory.com/entry/탐욕Greedy알고리즘동적Dynamic계획법

 

탐욕(Greedy)그리디알고리즘/동적(Dynamic)계획법 비교

Greedy 계획법과 Dynamic 계획법에 대해 알아보자. 예시 당신은 출발지A에서 도착지B로 가려고 한다. A에서 B로 가는 방법은 2가지가 있다. 출발하기전 신호등, 교통상황, 대중교통, 가는거리를 모두

skmouse.tistory.com

medium.com/@lunay0ung/동적-프로그래밍-dynamic-programming-5f5131380c22

 

동적 프로그래밍 / Dynamic Programming

정의 및 특징

medium.com

rain-bow.tistory.com/entry/DP와-Greedy-Algorithm

 

 

+ <동적계획법 vs 그리디알고리즘>에 대한 정리는 이 게시글에 이어 다른 게시글에 더 자세히 담아놨다.

(탐욕스러운 선택 조건과 최적 부분 구조 조건에 대해, 그리고 이 두 조건에서의 독립적이라는 표현의 정의의 시시비비는 피하는 것이 좋겠다. 관점에 따라서도 다를 수 있고, 그리고 추상적일 수 있는 것 같다.)

hevton.tistory.com/364

반응형