🥞 BE
home

11729_하노이 탑 이동 순서

담당자
완료 여부
Solved
요약
날짜
2025/03/28
태그
재귀
난이도
G5
출처
백준

코드

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayDeque; import java.util.Deque; class Main { static class Move { int N, start, mid, end; Move(int N, int start, int mid, int end) { this.N = N; this.start = start; this.mid = mid; this.end = end; } } public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int N = Integer.parseInt(br.readLine()); StringBuilder sb = new StringBuilder(); sb.append((int) (Math.pow(2, N) - 1).append("\n"); Deque<Move> stack = new ArrayDeque<>(); stack.push(new Move(N, 1, 2, 3)); while (!stack.isEmpty()) { Move m = stack.pop(); if (m.N == 1) { sb.append(m.start).append(" ").append(m.end).append("\n"); continue; } stack.push(new Move(m.N - 1, m.mid, m.start, m.end)); // 제일 마지막으로 이동 stack.push(new Move(1, m.start, m.mid, m.end)); // 중간으로 이동 stack.push(new Move(m.N - 1, m.end, m.start, m.mid)); // 처음으로 이동 } System.out.println(sb); } }
Java
복사
유명한 재귀문제라 간단히 재귀로 풀수도 있지만, stack으로 풀어도 재미있을 것 같아서 deque 활용해서 풀어봤다.
sb.append((int) (Math.pow(2, N) - 1).append("\n"); 이거로 횟수 구현해주는 부분에서 타입변환을 까먹어서 계속 실패했었다. pow 반환타입이 double인 부분 고려해야 할 것 같다.

문제 해결 아이디어

하노이 탑 구현에 대한 점화식을 잘 이해하고 정리하는 것이 중요하다. 재귀로 푸는게 메모리는 덜 잡아먹지만 확실히 속도가 느리고, 스택으로 푸는게 속도가 더 빨랐다.