[공부] 코테/백준

[백준 1914] 하노이 탑

woodisco 2024. 3. 14. 15:19

 

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

 

1914번: 하노이 탑

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

www.acmicpc.net

 

예를 들어 원판의 개수 N이 3이라면 아래와 같이 총 7번의 옮김이 필요하다.

위의 그림을 생각하며 포인트를 잡자면,
・ 장대1에 있는 마지막 1개의 원판을 장대3으로 옮겨야 한다.
・ 그럼 장대1에 있는 K-1개의 원판을 중간 기둥으로 옮겨야 한다.
・ 마지막으로 장대2로 옮겨놨던 K-1개의 원판을 다시 장대3으로 옮긴다.

"하노이 타워의 원판 이동 횟수" 라고 검색을 하면, 공식은 2^K - 1
코드로 나타내면 아래와 같다.
BigInteger bi = new BigInteger("2");
BigInteger a = bi.pow(K).subtract(BigInteger.ONE);
import java.math.BigInteger;
import java.util.Scanner;

// 1914번 : 하노이 탑
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int k = sc.nextInt();
        
        BigInteger bi = new BigInteger("2");
        BigInteger result = bi.pow(k).subtract(BigInteger.ONE);
        System.out.println(result);

        if (k<=20) { // n이 20 이하일 때만 하노이 탑 이동 과정 출력
            hanoi(k, 1, 2, 3);
        }    
    }

    // 하노이 탑 이동 순서 출력하는 메소드
    static void hanoi(int k, int start, int mid, int end) {
        if (k==1) {
            System.out.println(start + " " + end);
            return;
        }
        hanoi(k-1, start, end, mid);
        System.out.println(start + " " + end);
        hanoi(k-1, mid, start, end);
    }
}