[알고리즘] 분할정복 알고리즘

2025. 1. 13. 16:08·Algorithm

분할정복 알고리즘은 문제를 작게 분할한 후 각각을 정복하는 알고리즘이다.

큰 문제를 작은 문제로 분할하여 각각을 해결하고, 그 결과를 이용해 전체 문제를 해결한다.

 

분할된 작은 문제를 재귀적으로 해결하고, 이를 결합하여 원래 문제를 해결한다.

이진 탐색, 병합 정렬, 퀵 정렬 등이 모두 분할 정복 알고리즘이다.

 

 

정렬 알고리즘 최대 실행 시간 최소 실행 시간  평균 실행 시간
선택 정렬 O(n^2) O(n^2) O(n^2)
삽입 정렬 O(n^2) O(n) O(n^2)
합병 정렬 O(nlogn) O(nlogn) O(nlogn)
퀵 정렬 O(n^2) O(nlogn) O(nlogn)

 

 

<분할 정복 설계>

 

1. 나누기 (분할)

- 문제를 더 작은 하위 문제로 더 이상 쪼개질 수 없을 때까지 나눈다

 

2. 재귀적으로 해결 (정복)

- 하위 문제를 재귀적으로 해결한다.

 

3. 결합

- 문제를 통합하여 원래 문제의 답을 해결한다.

 

 

분할 정복 알고리즘의 장점

1. 전체 문제를 해결하는데 걸리는 시간을 줄일 수 있다.

2. 하위 문제를 병렬로 처리하기 쉬우므로 성능을 크게 향상시킬 수 있다.

3. 문제의 복잡도와 데이터 크기에 상관없이 적용할 수 있다.

 

 

 

분할 정복 알고리즘의 단점

1. 재귀적으로 호출되므로 많은 추가적인 메모리를 필요로 할 수 있다

2. 최악의 경우 시간복잡도가 크다.

3. 구현이 복잡할 수 있다

 

 

 

 

<퀵 정렬>

각 부분 수열의 맨 처음에 있는 수를 기준(pivot)으로 삼고, 이들보다 작은 수를 왼쪽으로, 큰 것을 오른쪽으로 가게끔 문제를 분할한다.

각 서브 배열을 재귀적으로 퀵 정렬한다.

정렬된 서브 배열들을 합친다.

 

 

분할정복 카테고리에 있는 문제 !

 

문제에서 말한대로 그대로 곱해서 출력하면 메모리 초과 오류가 뜬다.

지수법칙을 활용해서 분할정복 알고리즘을 이용해야 한다.

 

지수가 짝수일 경우

 

 

지수가 홀수일 경우

 

또한 나머지 연산을 위한 모듈러 공식을 이용해야 한다.

 

( a*b ) % c = ( a%c * b%c) % c

 

 

 

 public static long number(long a, int exponent) {
        if (exponent == 1) {
            return a;
        }

        long temp = number(a, exponent / 2);

        if (exponent % 2 == 1) {
            return temp * temp * a;
        }

        return temp * temp;
    }

 

지수 연산만 구현한 모습

나머지 연산은 ( a*b ) % c = ( a%c * b%c) % c 공식을 활용한다.

 

연산과정에서 int형의 범위를 넘길 수 있으므로 long 형으로 맞춰준다.

 

 

package 백준.분할정복;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class baekjoon_1629 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        long a = Long.parseLong(st.nextToken());
        long b = Long.parseLong(st.nextToken());
        long c = Long.parseLong(st.nextToken());
        System.out.println(number(a, b, c));
    }

    public static long number(long a, long b, long c) {
        if (b == 1) {
            return a % c;
        } else {
            long temp = number(a, b / 2, c);
            if (b % 2 == 1) {
                return (temp * temp % c) * a % c;
            }
            return temp * temp % c;
        }
    }

}

 

 

풀이 참고

https://st-lab.tistory.com/237

 

[백준] 1629번 : 곱셈 - JAVA [자바]

www.acmicpc.net/problem/1629 1629번: 곱셈 첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다. www.acmicpc.net 문제 알고리즘 [접근 방법] 이 문제는 얼핏

st-lab.tistory.com

 

'Algorithm' 카테고리의 다른 글

[알고리즘] DFS / BFS  (2) 2025.01.22
[알고리즘] 힙(heap) 자료구조  (1) 2025.01.15
[알고리즘] 이진탐색 알고리즘  (1) 2025.01.06
하노이탑 알고리즘 이해하기 (재귀함수 사용)  (1) 2025.01.01
[알고리즘] 브루트포스 알고리즘  (4) 2024.12.28
'Algorithm' 카테고리의 다른 글
  • [알고리즘] DFS / BFS
  • [알고리즘] 힙(heap) 자료구조
  • [알고리즘] 이진탐색 알고리즘
  • 하노이탑 알고리즘 이해하기 (재귀함수 사용)
zioni
zioni
  • zioni
    jiwon's dev.log
    zioni
  • 전체
    오늘
    어제
    • 분류 전체보기 (76) N
      • spring & java (13)
      • Algorithm (14) N
      • PS (37)
      • project (3)
      • experience (1)
      • etc (6)
      • study (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    java
    백준
    자바
    백준2525
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
zioni
[알고리즘] 분할정복 알고리즘
상단으로

티스토리툴바