알고리즘 설계 기법
동적 프로그래밍 기법 (Dynamic programming)
- 분할 정복 기법과 유사하게 부분 문제의 해답을 이용하는 방식으로 문제를 해결하는 방식
- 주어진 문제를 여러 개의 소문제로 분할하여 문제를 해결
상향식 설계기법
- 작은 문제부터 먼저 해결한 후 그 결과를 큰 문제에서 활용함으로써 효율성을 높이는 방법
동적 프로그래밍 방식 적용 방법
- 분할 정복식 방법과 마찬가지로 문제를 나눈 후, 주어진 부분 문제들을 한 번 계산한 후에는 특정 장소에 저장
- 부분 문제의 해가 필요할 때 이를 다시 계산하지 않고, 이전에 저장해둔 결과를 이용
- 일반적으로 동적 프로그래밍에서 부분 문제의 값을 저장하는 장소는 배열 형태를 사용
피보나치 수열 계산 과정의 트리
- 중복 계산 발생
- 다시 계산하지 않고 한번 계산한 값을 저장해 놓고 사용
분할 정복 기법 Vs. 동적 프로그래밍 기법
- 분할정복기법(하향식 설계 기법)
- 분할되는 솜누제가 독립적이어서 소문제를 다시 재귀적으로 풀어 그 결과를 합한다.
- 중복된 계산이 계속 발생
- 중복문제를 방지하기 위해 동적 프로그래밍 기법 사용
- 동적 프로그래밍 기법(샹향식 설계 기법)
- 부분 문제의 해답을 이용하는 방식으로 문제를 해결(분할 정복 기법과 동일)
- 소문제의 계산 결과를 표(배열)에 저장해 놓고 필요할 때 저장된 값을 호출하여 사용
- 따라서 중복 계산 제거
동적 프로그래밍 적용 대상
- 최적화 문제
- 최소치 또는 최대치를 구하는 최적화 문제에 적용
- 최적해는 기본적인 소문제의 최적해로부터 더 큰 크기의 소문제의 최적해를 구하는 과정을 거침
- 최적화 문제의 최적해는 여러 개가 있을 수 있지만 그 중의 하나를 구하면 됨
동적 프로그래밍 방법 적용 예
- 피보나치 수열
- 조약돌 놓기 문제
- 행렬 경로 문제
- 연쇄 행렬 곱셈
- 이항 계수
- 최단 경로 구하기
조약돌 놓기 문제
- 조약돌을 놓는 방법(제약조건)
- 각 열에는 적어도 하나의 조약돌을 놓아야 한다.
- 가로나 세로로 인접한 두 칸에 동시에 조약돌을 놓을 수 없다.
- 목표
- 돌이 놓인 자리에 있는 수의 합을 최대가 되도록 조약돌 놓기
행렬 경로 문제
- 양수 또는 음수 원소들로 구성된 N x N 행렬
- 행렬의 좌상단에서 시작하여 우하단까지 이동
- 이동 방법 (제약조건)
- 오른쪽이나 아래쪽으로만 이동 가능
- 왼쪽, 위쪽, 대각선 이동 불가
- 목표
- 행렬의 좌상단에서 시작하여 우하단까지 이동되, 방문한 칸에 있는 수들을 더한 값이 최소가 되도록 한다.
'프로그래밍 언어 > 자료구조 & 알고리즘' 카테고리의 다른 글
자료구조 - 순차리스트(2) 큐(Queue), 데크(Deque) (0) | 2021.11.29 |
---|---|
자료구조 - 순차리스트(1) 스택(Stack) (0) | 2021.11.29 |
알고리즘 설계 기법 - Greedy 알고리즘/욕심쟁이 기법 (0) | 2021.11.29 |
알고리즘의 설계 기법 - 분할정복기법/분할정복 알고리즘 (0) | 2021.11.26 |
순서도 작성 (0) | 2021.11.26 |