알고리즘

백준 11729번 하노이 탑 이동 순서(JAVA)

박카스마시며코딩 2022. 1. 27. 14:26

https://www.acmicpc.net/problem/11729

 

11729번: 하노이 탑 이동 순서

세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로

www.acmicpc.net

 

저는 해당 문제를 재귀를 이용하여 문제를 해결하였습니다.

문제를 부분적으로 나눠본다면 1에서 맨맽의 원반을 제외한 원반들을 2로 옮기고 맨 밑의 원반을 3으로 옮기고 2에 있는 원반들을 3으로 옮겨야합니다.

즉 from(1)에서 mid(2)로 맨밑을 빼고 전부 옮기고 from(1)에서 to(3)으로 맨밑의 것을 옮기고 다시 mid(2)에서 to(3)으로 2에 존재하는 모든 원반들을 옮겨야 합니다.

package BOJ.Recursion;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.function.Function;

public class BOJ_11729 {
    static private int hanoi(int depth, int from, int to, int mid, StringBuilder sb){
        if(depth == 0){
            return 0;
        }
        int result = 1;
        result += hanoi(depth-1, from, mid, to,sb);
        sb.append(from+" "+to+"\n");
        result += hanoi(depth-1, mid, to, from,sb);
        return result;
    }
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//        StringTokenizer st = new StringTokenizer(br.readLine());
        Function<String,Integer> stoi = Integer::parseInt;
        int n = stoi.apply(br.readLine());
        StringBuilder sb = new StringBuilder();
        System.out.println(hanoi(n,1,3,2, sb));
        System.out.println(sb.toString());
    }
}