코드
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인 부분 고려해야 할 것 같다.
문제 해결 아이디어
하노이 탑 구현에 대한 점화식을 잘 이해하고 정리하는 것이 중요하다. 재귀로 푸는게 메모리는 덜 잡아먹지만 확실히 속도가 느리고, 스택으로 푸는게 속도가 더 빨랐다.