Skip to content

Commit

Permalink
Divide and Conquer 관련 내용 추가. DP, DnC, Greedy 특징별 비교 내용 추가 (#178)
Browse files Browse the repository at this point in the history
  • Loading branch information
limjunhyuk97 authored Feb 26, 2022
1 parent 9db3e49 commit bb9676b
Showing 1 changed file with 25 additions and 0 deletions.
25 changes: 25 additions & 0 deletions Algorithm/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,31 @@ greedy 는 각 단계마다 지금 당장 가장 좋은 방법만을 선택하
1) 탐욕적 성택 속성 : 항상 각 단계에서 우리가 선택한 답을 포함하는 최적해가 존재하는가
2) 최적 부분 구조 : 각 단계에서 항상 최적의 선택만을 했을 때, 전체 최적해를 구할 수 있는가

#### Divide and Conquer (분할 정복)

분할 정복은 큰 문제를 작은 문제로 쪼개어 답을 찾아가는 방식이다.
하부구조(non-overlapping subproblem)가 반복되지 않는 문제를 해결할 때 사용할 수 있다.
최적화 문제(가능한 해답의 범위 중 최소, 최대를 구하는 문제), 최적화가 아닌 문제 모두에 적용할 수 있다.
top-down 접근 방식을 사용한다.
재귀적 호출 구조를 사용한다. 이때 call stack을 사용한다. (call stack에서의 stack overflow에 유의해야 한다.)

#### 접근 방법

1. Divide, 즉 큰 문제를 여러 작은 문제로 쪼갠다. Conquer 가능할 때까지 쪼갠다.
2. Conquer, 작은 문제들을 정복한다.
3. Merge, 정복한 작은 문제들의 해답을 합친다. 이 단계가 필요하지 않은 경우도 있다(이분 탐색).

### DP vs DIVIDE&CONQUER vs GREEDY

|Divide and Conquer|Dynamic Programming|Greedy|
|:---:|:---:|:---:|
|non-overlapping한 문제를 작은 문제로 쪼개어 해결하는데 non-overlapping|overlapping substructure를 갖는 문제를 해결한다.|각 단계에서의 최적의 선택을 통해 해결한다.|
|top-down 접근|top-down, bottom-up 접근||
|재귀 함수를 사용한다.|재귀적 관계(점화식)를 이용한다.(점화식)|반복문을 사용한다.|
|call stack을 통해 답을 구한다.|look-up-table, 즉 행렬에 반복적인 구조의 solution을 저장해 놓는 방식으로 답을 구한다.|solution set에 단계별 답을 추가하는 방식으로 답을 구한다.|
|분할 - 정복 - 병합|점화식 도출 - look-up-table에 결과 저장 - 나중에 다시 꺼내씀|단계별 최적의 답을 선택 - 조건에 부합하는지 확인 - 마지막에 전체조건에 부합하는지 확인|
|이분탐색, 퀵소트, 머지소트|최적화 이분탐색, 이항계수 구하디, 플로이드-와샬|크루스칼, 프림, 다익스트라, 벨만-포드|

#### Reference

[프로그래밍 대회에서 배우는 알고리즘 문제 해결 전략](http://www.yes24.com/24/Goods/8006522?Acode=101)
Expand Down

0 comments on commit bb9676b

Please sign in to comment.