분할정복 (또는 분할 통치)
- 피지배민을 분열시켜 통치에 용이하게 하는 방법
- 군을 분열시켜 각개격파하는 방법
분할 정복 알고리즘 - 큰 문제를 나누어서 풀고, 그 결과를 조합해서 문제를 해결하는 알고리즘 기법
알고리즘 기법
- 분할(Divide) : 해결할 문제를 여러개의 작은 문제로 나눈다.
- 정복(Conquer) : 작은 단위의 문제를 해결한다.
- 조합(Merge or Combine) : 해결한 작은 단위 문제들을 합해 원래 문제의 답을 구한다.
일반적으로 각 하위 문제들이 독립적으로 풀이가 가능한 형태로서, 하위 문제의 결과가 상위 문제의 풀이 방식에 영향을 주지 않을 때 분할 정복 알고리즘이라 이야기합니다.
그 특성상 분할 정복 알고리즘은 재귀함수를 이용해 풀이하는 경우가 많습니다.
하노이의 탑 알고리즘 이동순서
세개의 기둥과, 기둥에 꽂을 수 있는 다양한 크기의 원반이 있고, 그 원반들이 밑에서부터 큰것부터 차례대로 쌓여있을때, 다른 기둥에 전체 원반들을 옮기는 문제입니다. 이때,
- 한번에 하나의 원반만 옮길 수 있습니다.
- 가장 위에 쌓인 원반만 옮길 수 있습니다.
- 큰 원반이 작은 원반 위에 올라가 있으면 안됩니다.
이때 N개의 원반이 기둥(1)에 있다고 가정하면, N개를 한쪽 기둥(3)으로 완전히 옮기는 문제는, N - 1 개를 일단 다른 기둥(2)에 옮긴 다음, N번째 제일 큰 원반을 목표 기둥(3)으로 옮긴 뒤 다른 기둥(2)에 있던 N - 1 개의 원반을 목표 기둥(3)으로 옮기면 됩니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
private StringBuilder towerBuilder;
public static void main(String[] args) throws IOException {
new Main().solution();
}
public void solution() throws IOException {
int n = Integer.parseInt(new BufferedReader(new InputStreamReader(System.in)).readLine());
towerBuilder = new StringBuilder();
// 점화식을 이용해 풀이
towerBuilder.append((int) (Math.pow(2, n) - 1)).append('\\n');
hanoi(n, 1, 3, 2);
System.out.println(towerBuilder);
}
public void hanoi(int height, int start, int end, int other) {
if (height == 1) {
towerBuilder.append(start + " " + end + "\\n");
}
else {
hanoi(height - 1, start, other, end);
towerBuilder.append(start + " " + end + "\\n");
hanoi(height -1, other, end, start);
}
}
}
관련문제
11729번: 하노이 탑 이동 순서
세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로
www.acmicpc.net
1914번: 하노이 탑
세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로
www.acmicpc.net
'Algorithm' 카테고리의 다른 글
백준 1802 종이접기 (0) | 2023.07.11 |
---|---|
병합 정렬 (Merge Sort) 알고리즘 (0) | 2023.07.10 |
백준 13305 주유소 (0) | 2023.07.10 |
백준 10818 최소, 최대 (0) | 2023.07.09 |
백준 10828 스택 (0) | 2023.07.09 |