크래프톤 정글
크래프톤 정글 8기 - 11일차 TIL
고웅
2025. 3. 21. 22:04
TIL - 2025.03.21 (금요일)
📝 오늘 배운 것 (분할 정복 알고리즘 (Divide and Conquer))
분할 정복 알고리즘이란
분할 정복 알고리즘(Divide and Conquer Algorithm)은 그대로 해결할 수 없는 문제를 작은 문제로 분할하여 해결하는 방법이나 알고리즘이다.
분할 정복 알고리즘은 재귀적인 방법을 통해 문제를 해결하며, 대표적인 예시로 이진탐색(Binary Search), 병합 정렬(Merge Sort), 퀵정렬(Quick Sort)이 예로 들 수 있다.
동적계획법(Dinamic Programming)과 다른 점
다이나믹 프로그램 역시 한 문제를 작게 나눈 다는 점에서 유사한 접근 방식을 가지고 있지만 차이가 있다.
- 분할 정복 - 문제를 작게 나누어 해결하고, 이 해결을 결합하여 원래의 문제를 해결한다. 재귀를 이용해 구현하는 것이 일반적이며 부분 문제들이 서로 독립적일 때 사용하기 좋다. 그 예가 합병정렬이다.
- 동적 계획법 - 하위 문제들을 한 번씩만 계산하고 이를 이용해여 상위 문제를 효율적으로 계산하는 것이 목적 반복을 이용해 구현하는 것이 일반적이며 부분 문제들이 서로 종속적일 때 사용하기 좋다. 예로는 최단 경로 문제가 있다.
분할 정복 알고 리즌 탐색 과정
- 분할 : 문제를 작은 하위 문제로 분할
- 정복 : 각 하위 문제를 재귀적으로 해결
- 결합 : 하위 문제의 해결책을 결합하여 원래 문제를 해결
백준 1074 Z
크래프톤 정글 8기 1주 차 학습 문제로 나왔던 것이 Z이다. 1주 차에서는 재귀를 학습하기 위한 문제로 선택되었지만 더 세부적으로 이 문제는 분할 정복에 포함된다는 것이다.
16*16 사이즈의 배열에서 원하는 값을 얻기위해 문제 설명에도 있듯 작은 문제로 나누어 설명하고 있다.
이 문제는 배열의 중앙 값을 기준으로 4개의 구간으로 나누고 이 구간을 다시 4개의 구간으로 나누어 2*2 사이즈의 배열에서 원하는 값을 계산하는 것이다.
분할정복 장단점
장점:
- 빠른 속도: 큰 문제를 작은 하위 문제로 분할하고 해결하여 전체 문제를 해결하는 데 걸리는 시간을 줄일 수 있다.
- 쉬운 병렬화: 분할정복 알고리즘은 하위 문제를 병렬로 처리하며 이는 멀티코어 시스템에서 성능을 향상할 수 있다.
- 유연성: 여러 응용 분야에서 사용할 수 있으며, 문제의 복잡도와 데이터 크기에 상관없이 작용할 수 있다.
단점:
- 추가적인 메모리 요구: 재귀적인 호출로 많은 추가 메모리가 필요할 수 있다.
- 최악 시간 복잡도: 분할 정복 알고리즘이 항상 최악의 경우에도 빠른 해결책을 제공하는 것은 아니다.
- 구현의 복잡성: 구현이 복잡하다.
시간 복잡도
분할 정복의 시간 복잡도는 분할, 결합, 정복 세 단계에서 각각의 연산량에 따라 결정된다.
시간복잡도 : O(NlogN)
일반 적인 시간복잡도로 문제의 특성에 따라 달라질 수 있다.
📖 예시 문제
💡 문제 해결
백준 1629 곱셈
a, b, c = map(int, input().split())
def dac(a, b, c):
if b == 1:
return a % c
elif b % 2 == 0:
return (dac(a,b//2,c)**2)%c
else:
return ((dac(a,b//2,c)**2)*a)%c
print(dac(a,b,c))
크래프톤 정글 알고리즘 2주 차에 분할정복 키워드로 포함된 문제인데 분할 정복을 이용해 거듭 제곱을 계산할 수 있다.
🔍 더 알아볼 것
- 분할 정복 문제 더 풀기
🧐 느낀 점
분할 정복 정말 어렵다... 재귀가 아직 어려워서 더 그렇게 느껴지는 것인지 분할에 대한 아이디어가 잘 떠올려지지 않아 서 그런 것 같다.