sum([5])를 conquer하고, 이후 개별적으로 conquer하고 merge를 해서 sum([1,2,3,4,5])를 해결# 주어진 숫자에 대해서 덧셈을 실행하는 경우(문제에 따라 분할하는 정도가 다를 수 있다.)
[1, 2, 3, 4, 5]
# step 1
sum([1,2,3,4,5]) = sum([1]) + sum([2,3,4,5]) # Divide
# step 2
sum([2,3,4,5]) = sum([2]) + sum([3,4,5]) # Divide
# step 3
sum([3,4,5]) = sum([3]) + sum([4,5]) # Divide
# step 4
sum([4,5]) = sum([4]) + sum([5]) # Divide
# step 5
sum([5]) = 5 # Conquer
-> 서브문제 sum([5])에 대한 답이 나왔고, 나머지 서브문제 sum([4]), sum([3]) 등에 대한 문제들도 Conquer를 진행
-> 개별적으로 Conquer 후 Merge
문제를 분할하지 못하거나 그럴 필요가 없는 경우에는 답을 구함
조건
동일한 문제를 재귀로 해결할 때 vs 분할정복으로 해결할 때
# 재귀 : 1부터 10까지의 합
def func(num):
if num < 1:
return 0
else:
return num + func(num-1)
func(10)
# 분할정복 : 1부터 10까지의 합
def func(num):
if num == 1:
return 1
if num % 2 == 1:
return func(num - 1) + num
else:
return func(num / 2) * 2 + (num / 2) * (num / 2)
func(10)
퀵정렬: 전체 탐색할 때 좌우로 나눠서 재귀적으로 수행하므로 병합정렬보다는 빠름
병합 정렬: divide and conquer 로직으로 인해 처음과 끝을 계속해서 탐색하므로 상대적으로 느림