By POSTECH Computer Algorithm Team
분할정복
남진환
Decide & Conquer
Contents
POSTECH Computer Algorithm Team
01
분할정복 00
Merge Sort 02
DP vs 분할정복
POSTECH Computer Algorithm Team
- 문제를 풀기 위해 하나의 문제를 여러 개의 작은 문제로 나누어 푸는 방법
- 작은 문제를 풀고나서 그 결과를 합치는 과정이 존재함
- 보통 재귀함수가 많이 사용된다
분할정복 분할정복
POSTECH Computer Algorithm Team
- 어떤 수 n이 주어졌을 때, 2 𝑛
을 빨리 구하는 방법?
- 반복문을 만들어서, 한번 돌때마다 2를 곱해준다 – O(N)
- 더 빠른 방법?
피보나치 수 분할정복
POSTECH Computer Algorithm Team
분할정복
- 2 𝑛
= 2
𝑛
2 * 2
𝑛
2 이다!
- 2 𝑛
을 구하기 위해서는 2
𝑛
2을 구하고, 2
𝑛
2을 구하기 위해서는 2
𝑛
4를 구하고..
- n이 홀수라면? => 2 𝑛
= 2
𝑛−1
2 ∗ 2
𝑛−1
2 * 2
- 시간 복잡도 O(log2 𝑛)
- 로그 스케일로 빨라졌다!
POSTECH Computer Algorithm Team
- 이렇게만 보면 DP와 분할정복의 차이를 잘 못 느낄 수도 있으니, 비교해보자.
- 피보나치 수열은 Fn = Fn-1 + Fn-2 로 정의된다 (F1 = 1, F2 = 1)
- Fn을 구하기 위해 DP와 분할정복을 사용해보자
DP vs 분할정복 DP vs 분할정복
POSTECH Computer Algorithm Team
DP vs 분할정복
- Fn = Fn-1 + Fn-2 에서 Fn-1을 구했다면 Fn-2는 이미 메모에 저장되어 있으므로 계산할 필요가 없다
- 시간복잡도 O(N)
POSTECH Computer Algorithm Team
DP vs 분할정복
- Fn을 구하기 위해 Fn-1을 구한 후, Fn-2을 구하기 위해 처음부터 다시 시작한다
- 시간복잡도 O(2 𝑛
)
POSTECH Computer Algorithm Team
DP vs 분할정복
- Fn-1을 구하는 것은 Fn-2를 구하는 것과 연관되어있다.
- DP는 메모를 통해 중복되는 계산을 배제해서 빠르게 값을 얻어낸다.
- 분할정복의 경우, Fn-1을 구한 다음 Fn-2를 구할때 앞선 결과를 기억하지 않아서 중복되는 계산이 많다!
POSTECH Computer Algorithm Team
DP vs 분할정복
- DP는 각 부분문제들이 서로 연관성이 있을 때 주로 사용한다
- 분할정복은 각 부분문제들이 서로 연관성이 없어 독립적으로 해결할 수 있을 때 주로 사용한다
- 그래서 분할정복으로 풀려면 부분문제를 잘 정의해야 한다.
POSTECH Computer Algorithm Team
- 피보나치 수열을 구할 때, DP는 O(N)만에, 분할정복은 O(2 𝑛
)만에 구해냈다.
- DP가 빠르고 분할정복이 느린 이유는 피보나치 수열이 각 부분문제끼리 연관성이 있기 때문일까?
분할정복 < DP ? DP vs 분할정복
POSTECH Computer Algorithm Team
- 어떤 수 n이 주어졌을 때, 2 𝑛
을 빨리 구하는 방법?
=> 2
𝑛
2 로 쪼개서 부분 문제를 푼다!
O(log2 𝑛)
분할정복 < DP ? DP vs 분할정복
POSTECH Computer Algorithm Team
DP vs 분할정복
- 어떤 수 n이 주어졌을 때, 2 𝑛
을 빨리 구하는 방법?
- 2
𝑛
2 로 쪼개서 부분 문제를 푼다!
- 시간복잡도 O(log2 𝑛)
POSTECH Computer Algorithm Team
DP vs 분할정복
- Fn = Fn-1 + Fn-2 => (Fn) = (1 1) 𝐹𝑛−1
𝐹𝑛−2
- 시간복잡도 O(log2 𝑛)
POSTECH Computer Algorithm Team
DP vs 분할정복
- 문제를 풀기위해 작은 문제로 나누어 푸는 방법을 사용할 때, 문제를 어떻게 해석하느냐에 따라
분할정복이 빠를 수도, DP가 빠를 수도 있다.
- 작은 문제들끼리의 연관성이 있더라도 좋은 알고리즘을 만든다면 분할정복이 더 빠를 수도 있다!
POSTECH Computer Algorithm Team
- Sort란, 배열 내의 숫자를 크기 순으로 정렬하는 것
O(Nlog2 𝑁)
- Merge Sort : 숫자를 재배열하기 위해 각 배열을 절반으로 쪼개서
그 배열을 오름차순으로 만든다
=> 문제를 부분 문제로 나눈 후 푼다
- 두 배열을 합칠 때 다시 두 배열의 앞 숫자부터 오름차순으로 정렬한다
=> 부분 문제를 풀고나서 합친다
https://www.geeksforgeeks.org/merge-sort/
Merge Sort Merge Sort
POSTECH Computer Algorithm Team
- https://www.acmicpc.net/problem/2447
- https://www.acmicpc.net/problem/1992
- https://www.acmicpc.net/problem/1780
- https://www.acmicpc.net/problem/6549 - 스택으로도 풀 수 있지만 분할정복으로 풀어보자
연습문제 분할정복
POSCAT
Thank you :-)

05 divide and conquer

  • 1.
    By POSTECH ComputerAlgorithm Team 분할정복 남진환 Decide & Conquer
  • 2.
    Contents POSTECH Computer AlgorithmTeam 01 분할정복 00 Merge Sort 02 DP vs 분할정복
  • 3.
    POSTECH Computer AlgorithmTeam - 문제를 풀기 위해 하나의 문제를 여러 개의 작은 문제로 나누어 푸는 방법 - 작은 문제를 풀고나서 그 결과를 합치는 과정이 존재함 - 보통 재귀함수가 많이 사용된다 분할정복 분할정복
  • 4.
    POSTECH Computer AlgorithmTeam - 어떤 수 n이 주어졌을 때, 2 𝑛 을 빨리 구하는 방법? - 반복문을 만들어서, 한번 돌때마다 2를 곱해준다 – O(N) - 더 빠른 방법? 피보나치 수 분할정복
  • 5.
    POSTECH Computer AlgorithmTeam 분할정복 - 2 𝑛 = 2 𝑛 2 * 2 𝑛 2 이다! - 2 𝑛 을 구하기 위해서는 2 𝑛 2을 구하고, 2 𝑛 2을 구하기 위해서는 2 𝑛 4를 구하고.. - n이 홀수라면? => 2 𝑛 = 2 𝑛−1 2 ∗ 2 𝑛−1 2 * 2 - 시간 복잡도 O(log2 𝑛) - 로그 스케일로 빨라졌다!
  • 6.
    POSTECH Computer AlgorithmTeam - 이렇게만 보면 DP와 분할정복의 차이를 잘 못 느낄 수도 있으니, 비교해보자. - 피보나치 수열은 Fn = Fn-1 + Fn-2 로 정의된다 (F1 = 1, F2 = 1) - Fn을 구하기 위해 DP와 분할정복을 사용해보자 DP vs 분할정복 DP vs 분할정복
  • 7.
    POSTECH Computer AlgorithmTeam DP vs 분할정복 - Fn = Fn-1 + Fn-2 에서 Fn-1을 구했다면 Fn-2는 이미 메모에 저장되어 있으므로 계산할 필요가 없다 - 시간복잡도 O(N)
  • 8.
    POSTECH Computer AlgorithmTeam DP vs 분할정복 - Fn을 구하기 위해 Fn-1을 구한 후, Fn-2을 구하기 위해 처음부터 다시 시작한다 - 시간복잡도 O(2 𝑛 )
  • 9.
    POSTECH Computer AlgorithmTeam DP vs 분할정복 - Fn-1을 구하는 것은 Fn-2를 구하는 것과 연관되어있다. - DP는 메모를 통해 중복되는 계산을 배제해서 빠르게 값을 얻어낸다. - 분할정복의 경우, Fn-1을 구한 다음 Fn-2를 구할때 앞선 결과를 기억하지 않아서 중복되는 계산이 많다!
  • 10.
    POSTECH Computer AlgorithmTeam DP vs 분할정복 - DP는 각 부분문제들이 서로 연관성이 있을 때 주로 사용한다 - 분할정복은 각 부분문제들이 서로 연관성이 없어 독립적으로 해결할 수 있을 때 주로 사용한다 - 그래서 분할정복으로 풀려면 부분문제를 잘 정의해야 한다.
  • 11.
    POSTECH Computer AlgorithmTeam - 피보나치 수열을 구할 때, DP는 O(N)만에, 분할정복은 O(2 𝑛 )만에 구해냈다. - DP가 빠르고 분할정복이 느린 이유는 피보나치 수열이 각 부분문제끼리 연관성이 있기 때문일까? 분할정복 < DP ? DP vs 분할정복
  • 12.
    POSTECH Computer AlgorithmTeam - 어떤 수 n이 주어졌을 때, 2 𝑛 을 빨리 구하는 방법? => 2 𝑛 2 로 쪼개서 부분 문제를 푼다! O(log2 𝑛) 분할정복 < DP ? DP vs 분할정복
  • 13.
    POSTECH Computer AlgorithmTeam DP vs 분할정복 - 어떤 수 n이 주어졌을 때, 2 𝑛 을 빨리 구하는 방법? - 2 𝑛 2 로 쪼개서 부분 문제를 푼다! - 시간복잡도 O(log2 𝑛)
  • 14.
    POSTECH Computer AlgorithmTeam DP vs 분할정복 - Fn = Fn-1 + Fn-2 => (Fn) = (1 1) 𝐹𝑛−1 𝐹𝑛−2 - 시간복잡도 O(log2 𝑛)
  • 15.
    POSTECH Computer AlgorithmTeam DP vs 분할정복 - 문제를 풀기위해 작은 문제로 나누어 푸는 방법을 사용할 때, 문제를 어떻게 해석하느냐에 따라 분할정복이 빠를 수도, DP가 빠를 수도 있다. - 작은 문제들끼리의 연관성이 있더라도 좋은 알고리즘을 만든다면 분할정복이 더 빠를 수도 있다!
  • 16.
    POSTECH Computer AlgorithmTeam - Sort란, 배열 내의 숫자를 크기 순으로 정렬하는 것 O(Nlog2 𝑁) - Merge Sort : 숫자를 재배열하기 위해 각 배열을 절반으로 쪼개서 그 배열을 오름차순으로 만든다 => 문제를 부분 문제로 나눈 후 푼다 - 두 배열을 합칠 때 다시 두 배열의 앞 숫자부터 오름차순으로 정렬한다 => 부분 문제를 풀고나서 합친다 https://www.geeksforgeeks.org/merge-sort/ Merge Sort Merge Sort
  • 17.
    POSTECH Computer AlgorithmTeam - https://www.acmicpc.net/problem/2447 - https://www.acmicpc.net/problem/1992 - https://www.acmicpc.net/problem/1780 - https://www.acmicpc.net/problem/6549 - 스택으로도 풀 수 있지만 분할정복으로 풀어보자 연습문제 분할정복
  • 18.