
-Code
import java.util.Scanner;
public class BOJ11729 {
static StringBuilder answer = new StringBuilder();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int diskCnt = sc.nextInt();
hanoi(diskCnt, 1, 3, 2);
// 옮긴 횟수 계산
System.out.println((int) Math.pow(2, diskCnt) - 1);
System.out.println(answer);
}
/** 하노이 탑 옮기기 로직
* @param diskCnt 현재 존재하는 원판
* @param start 시작점
* @param end 목적지
* @param other 경유지
*/
private static void hanoi(
int diskCnt, int start, int end, int other
) {
// 위에 원판이 없어 옮기면 되는 경우
if (diskCnt == 1) {
answer.append(start + " " + end).append("\n");
return;
}
// 현재 옮겨야 하는 원판 위에 (diskCnt - 1)개의 원판
// 시작점과 목적지가 아닌 위치로 옮기기
hanoi(diskCnt - 1, start, other, end);
// 위에 원판을 경유지에 옮겨서 현재 원판 옮김
answer.append(start + " " + end).append("\n");
// 경유지에 있는 원판들 목적지로 옮기기
hanoi(diskCnt - 1, other, end, start);
}
}
처음에는 하노이 탑이 어떻게 진행되는지를 몰라 찾아보고 횟수를 구하는 법은 정해져 있어서 쉬웠습니다. 하지만 재귀를 이용하는 푸는 것에 대해서 어렵게 느껴져서 힌트를 이곳저곳에서 얻고 제가 직접 코딩해서 맞을 때까지 계속 시도했습니다. 생각보다 결과인 재귀 로직은 짧지만 이해하는데 오래 걸렸습니다.
'Beakjoon&프로그래머스 > Java' 카테고리의 다른 글
| [백준/Java] 2580번 스도쿠 (0) | 2025.12.30 |
|---|---|
| [백준/Java] 14888번 연산자 끼워넣기 (0) | 2025.12.30 |
| [백준/Java] 30009번 포지션 제로 (0) | 2025.12.30 |
| [백준/Java] 9184번 신나는 함수 실행 (0) | 2025.12.29 |
| [백준/Java] 14889번 스타트와 링크 (0) | 2025.12.29 |