백준/재귀
BOJ 11729 - 하노이 탑 이동 순서
누누01
2022. 11. 2. 14:27
728x90
https://www.acmicpc.net/problem/11729
11729번: 하노이 탑 이동 순서
세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로
www.acmicpc.net
n개의 원판이 시작점에서 경유지를 거쳐 도착점까지 가는 과정을 F(n) 이라고 해보자.
그리고 세 장대를 각각 A, B, C라고 하자.
A 맨 밑에 있는 원판을 C로 옮기기 위해서는 다음과 같은 과정을 거쳐야 한다.
1. A에 맨 밑에 있는 원판을 제외한 원판 (n-1)을 C를 경유하여 B로 옮긴다. -> F(n-1)
2. A에 있는 원판을 C로 옮긴다. -> 1
3. B에 있는 원판을 A를 경유하여 C로 옮긴다. -> F(n-1)
따라서 F(n) = 2 * F(n-1) + 1 이라는 점화식이 등장한다.
이 점화식을 바탕으로 재귀를 돌리고 n 값이 가장 작은 단위(1)가 될 때 출력해주면 구현이 완성된다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static StringBuilder SB = new StringBuilder();
static int COUNT = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int number = Integer.parseInt(br.readLine());
hanoi(number, 1, 2, 3);
System.out.println(COUNT);
System.out.println(SB);
br.close();
}
public static void move(int start, int end) {
COUNT++;
SB.append(start + " " + end + "\n");
}
public static void hanoi(int number, int start, int via, int end) {
if (number == 1) {
move(start, end);
return;
}
hanoi(number - 1, start, end, via);
move(start, end);
hanoi(number - 1, via, start, end);
}
}