본문 바로가기
Beakjoon&프로그래머스/Java

[백준/Java] 11729번 하노이 탑 이동 순서

by 현장 2025. 12. 30.

-Code

import java.util.Scanner;

public class BOJ11729 {
    static StringBuilder answer = new StringBuilder();
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int diskCnt = sc.nextInt();

        hanoi(diskCnt, 1, 3, 2);
        // 옮긴 횟수 계산
        System.out.println((int) Math.pow(2, diskCnt) - 1);
        System.out.println(answer);
    }
    /** 하노이 탑 옮기기 로직
     * @param diskCnt 현재 존재하는 원판
     * @param start   시작점
     * @param end     목적지
     * @param other   경유지
     */
    private static void hanoi(
            int diskCnt, int start, int end, int other
    ) {
        // 위에 원판이 없어 옮기면 되는 경우
        if (diskCnt == 1) {
            answer.append(start + " " + end).append("\n");
            return;
        }
        // 현재 옮겨야 하는 원판 위에 (diskCnt - 1)개의 원판
        // 시작점과 목적지가 아닌 위치로 옮기기
        hanoi(diskCnt - 1, start, other, end);
        // 위에 원판을 경유지에 옮겨서 현재 원판 옮김
        answer.append(start + " " + end).append("\n");
        // 경유지에 있는 원판들 목적지로 옮기기
        hanoi(diskCnt - 1, other, end, start);
    }
}

처음에는 하노이 탑이 어떻게 진행되는지를 몰라 찾아보고 횟수를 구하는 법은 정해져 있어서 쉬웠습니다. 하지만 재귀를 이용하는 푸는 것에 대해서 어렵게 느껴져서 힌트를 이곳저곳에서 얻고 제가 직접 코딩해서 맞을 때까지 계속 시도했습니다. 생각보다 결과인 재귀 로직은  짧지만 이해하는데 오래 걸렸습니다.