백준풀이
[백준/자바] 11729: 하노이의 탑 이동 순서
요빈
2023. 5. 18. 15:57
https://www.acmicpc.net/problem/11729
11729번: 하노이 탑 이동 순서
세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로
www.acmicpc.net

하노이의 탑은 쌓아 놓은 원반을 최소 횟수로 옮기기 위한 알고리즘이다.
처음에 모든 원반이 크기가 큰 순서대로 첫 번째 기둥에 쌓여 있고, 모든 원반을 세 번째 기둥으로 최소의 횟수로 옮기는 문제이다. '하노이의 탑' 문제는 대표적인 재귀 알고리즘 문제이다.
'하노이의 탑' 알고리즘은 크게 3단계로 나눌 수 있다.
- 바닥의 원반을 제외한 그룹을 시작 기둥에서 중간 기둥으로 이동
- 바닥의 원반을 시작 기둥에서 목표 기둥으로 이동
- 바닥의 원반을 제외한 그룹을 중간 기둥에서 시작 기둥으로 이동
원반의 개수에 따라 위 과정이 재귀적으로 실행된다.
풀이 코드는 다음과 같다.
public class Boj_11729 {
static int count = 0;
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws NumberFormatException, IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
move(N, 1, 3);
System.out.println(count);
System.out.println(sb);
}
static void move(int n, int x, int y) {
if(n>1)
move(n-1, x, 6-x-y);
sb.append(x + " " + y + "\n");
count += 1;
if(n>1)
move(n-1, 6-x-y, y);
}
}
* 추가적으로 '하노이의 탑' 문제에서 원판을 옮기는 최소 이동 횟수는 2^n - 1이다.
더보기
첫 풀이: StringBuilder 대신 ArrayList에 배열 {x, y}에 넣고, main 함수에서 for문을 통해 출력 -> 시간초과
별 다른 기능 없이 그저 print가 목적이므로 StringBuilder로 수정