21.08.10 기록

최대 1 분 소요

백준 알고리즘 11729 풀이

🎆해설(메모리 101MB, 시간 536ms로 통과)

-손코딩 후 타이핑으로 풀이해봤지만 도저히 풀지 못하겠어서 해설을 봤다.
-하노이 탑 공식은 수열로 유도할 수 있다.

n개의 원판을 이동시키기 위한 이동 횟수를 $a_n$이라고 할 때, n개의 원판을 옮기려면 그 위쪽에 있는 ①(n-1)개의 원판을 모두 다른 막대로 옮긴 후, ②맨 아래 원판을 빈 막대로 옮긴 다음에 ③그 위에 (n-1)개의 원판을 옮겨놓아야한다.

  • 수식으로 표현하면 ①은 $a_{n-1}$, ②는 1, ③은 $a_{n-1}$로 아래와 같다.
  • $a_n = a_{n-1} + 1 + a_{n-1} = 2 × a_{n-1} + 1$
  • 위 수식을 귀납적으로 정리하면 일반항은 $a_n = 2^n-1$이다. (상세 내용 해설 링크 참조)

-공식을 사용한 코드는 아래와 같다.

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

public class B11729 {
    public static StringBuilder sb = new StringBuilder();

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        sb.append((int) (Math.pow(2, N) - 1)).append("\n");
        hanoi(N, 1, 2, 3);
        System.out.println(sb);

    }

    //start: 출발지, mid: 옮기기 위해 이동하는 장소, end: 목적지
    public static void hanoi(int N, int start, int mid, int end) {
        if(N == 1) {
            sb.append(start + " " + end + "\n");
            return;
        }

        //1. N-1개를 A에서 B로 이동
        hanoi(N-1, start, end, mid);

        //2. 1개를 A에서 C로 이동
        sb.append(start + " " + end + "\n");

        //3. N-1개를 B에서 C로 이동
        hanoi(N-1, mid, start, end);
    }
}

카테고리:

업데이트: