백준 - JAVA/재귀

[백준] 11729번 : 하노이 탑 이동 순서 _ JAVA ( 주석 설명 )

wch_s 2023. 2. 14. 18:36

1번

이 또한 처음 걸음을 떼기 어려워, 아래 자료를 보고 이해한 후 코드를 짰다.

매우 자세히 설명을 해주셔서 초보자도 이해하는 데 무리가 없으리라 생각한다. 

https://shoark7.github.io/programming/algorithm/tower-of-hanoi


 

'하노이의 탑' 이해하기

'하노이의 탑' 문제를 이해하고 문제 해결을 위한 핵심 통찰을 살핀 뒤 코드로 작성합니다. 이후 탑의 개수에 따른 총 이동 횟수를 구하는 일반항까지 수학적으로 유도합니다.

shoark7.github.io


 

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());

        //start(출발지)에서 to(목적지)로 via(경유지)를 거쳐 총 N개의 원반 옮긴다.
        hanoi(N,'1','3','2');

        System.out.println(count);
        System.out.println(sb);
    }

    private static void hanoi(int N, char start, char to, char via) {
        //1개의 원반을 start에서 to로 옮긴다.
        if(N==1)
            move(1, start, to);
        else {
            hanoi(N - 1, start, via, to); //N-1개의 원반을 경유지로 옮긴다.
            move(N, start, to); //N번째 원반을 목적지로 옮긴다.
            hanoi(N - 1, via, to, start); //경유지에 있는 N-1개의 원반을 목적지로 옮긴다.
        }
    }

    static int count = 0; //옮긴 횟수를 카운팅하는 변수
    static StringBuilder sb = new StringBuilder();
    private static void move(int N, char start, char to){
        ++count; //옮긴 횟수를 카운팅한다.
        sb.append(start).append(' ').append(to).append('\n'); //
    }
}