11729번: 하노이 탑 이동 순서
세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로
www.acmicpc.net
코드
import java.util.Scanner;
public class Main {
private static StringBuilder sb = new StringBuilder();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); // 원판의 개수
System.out.println((int)Math.pow(2, n) - 1); // 옮긴횟수 출력
hanoi(1, n, 1, 3, 2); // 하노이의탑 재귀함수 호출
System.out.print(sb);
}
/**
* 하노이의탑 재귀함수
* @param start 원판의 시작번호
* @param end 원판의 마지막번호
* @param src 원판의 출발지점
* @param dst 원판의 도착지점
* @param temp 중간지점
*/
private static void hanoi(int start, int end, int src, int dst, int temp) {
if (start > end) // 시작번호가 끝번호보다 큰경우 무시
return;
if (start == end) { // 시작번호와 끝번호가 같은경우 출발지점 -> 도착지점 출력
sb.append(src + " " + dst + "\n");
return;
}
hanoi(start, end - 1, src, temp, dst); // 마지막번호제외한 원판을 출발지점에서 중간지점으로 이동
hanoi(end, end, src, dst, temp); // 마지막번호 원판을 출발지점에서 도착지점으로 이동
hanoi(start, end - 1, temp, dst, src); // 마지막번호 원판제외한 원판을 중간지점에서 도착지점으로 이동
}
}
설명
첫번째 장대에서 세번째 장대로 N개의 원판을 옮기기위해선 일단 N번원판을 제외한 N - 1개의 원판을 첫번째장대에서 두번째장대로 옮긴후, N번원판을 첫번째장대에서 세번째장대로 옮긴후, N-1개의 원판을 두번째장대에서 세번째 장대로 옮기면 된다.
결국 하노이의탑옮긴횟수 점화식은 A(n) = 2*A(n - 1) + 1, A(1) = 1로 세울수있다.
점화식을 최적화하면 A(n) = 2^n - 1 이다.
728x90
'알고리즘 > 재귀' 카테고리의 다른 글
[백준][JAVA] 1914번 하노이 탑 (0) | 2024.01.08 |
---|---|
[백준][JAVA] 17478번 재귀함수가 뭔가요? (0) | 2023.12.18 |