자료구조와 알고리즘/알고리즘

[알고리즘] - 분할 정복 (Divide and Conquer)

jenlve 2023. 12. 16. 23:41

분할 정복 ( Divide & Conquer )

큰 문제작은 부분 문제로 나누어서 해결하는 방법 

      ex. 합병 정렬, 퀵 정렬, 이진 검색 etc.

 

 

✏ 분할 정복의 장/단점

<장점>

- 큰 문제에서 작은 문제로,  문제를 나눔으로써 어려운 문제를 해결할 수 있다.

- 서로 영향이 없는 데이터 간에 분할(병렬 처리)해서 처리할 수 있다. 

 

<단점>

- 동일 코드 재귀 호출로 인한 오버헤드가 발생할 수 있다. 

- 스택 오버플로우, 과도한 메모리 사용을 초래하게 된다. 

 

 

🚩 분할 정복 문제 풀이 단계

 1. 분할 (Divide) : 문제를 하나 이상의 작은 부분들로 나눈다.

 2. 정복 (Conquer) : 각각의 부분 문제들을 해결한다, 정복해 나간다.

 3. 결합 (Combine) : 각 부분들의 해답을 통합하여 원래 문제의 답을 구한다. 

 

✏ 분할 정복 문제 파악 및 풀이 시 고려사항

- 해결할 큰 문제와 분할되는 작은 문제가 궁극적으로 같은 형태를 띄는지

- 재귀! 구조를 쓰기 떄문에, 재귀 탈출 조건을 작성해줘야 한다!

🌟 분할 정복은 시간 복잡도면에서 주의깊게 생각해야 한다. 입력값의 크기가 커질수록 모든 데이터의 값을 일일이 구해서 합치게 되면 시간 초과가 발생하게 된다. 즉, 필수적으로 구해야 하는 부분만을 구할 수 있는 코드를 작성해야 한다.  (탐색 깊이와 탐색 너비를 잘 고려해야 한다.)

 

 

💡분할 정복과 동적 계획법(DP)

: 문제를 풀다보니, 같은 문제에 대해서  분할 정복으로, 그리고 동적 계획법으로 풀 수 있는 문제를 접하게 되었다.

https://www.acmicpc.net/problem/1912

 

1912번: 연속합

첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.

www.acmicpc.net

 

해당 문제는 문제를 잘게 쪼개서, 결과적으로 큰 부분을 보는 문제이긴 하지만, 각 특성을 비교해 보았을 때, 동적 계획법을 사용하는 것이 시간 복잡도 측면에서 바람직하다.

 

✏ 차이점으로는

동적 계획법은 부분 문제가 중복!이 되며, 상위 문제를 해결해나가는 경우이고,

분할 정복은 부분 문제는 서로 독립적!이라는 것이다.

 

추가적으로 두 알고리즘의 시간 복잡도는 

풀이에 따라 달라질 수 있지만 대개 분할 정복은 〖O(nlog〗_2⁡〖n)〗 의 시간 복잡도를, 동적 계획법은 O(n) 시간복잡도를 가진다. 

 

즉 분할 정복이 log의 배수만큼 더 걸리게 되는 것이다.