백준 - JAVA/재귀
[백준] 11729번 : 하노이 탑 이동 순서 _ JAVA ( 주석 설명 )
wch_s
2023. 2. 14. 18:36
1번
→
이 또한 처음 걸음을 떼기 어려워, 아래 자료를 보고 이해한 후 코드를 짰다.
매우 자세히 설명을 해주셔서 초보자도 이해하는 데 무리가 없으리라 생각한다.
https://shoark7.github.io/programming/algorithm/tower-of-hanoi
'하노이의 탑' 이해하기
'하노이의 탑' 문제를 이해하고 문제 해결을 위한 핵심 통찰을 살핀 뒤 코드로 작성합니다. 이후 탑의 개수에 따른 총 이동 횟수를 구하는 일반항까지 수학적으로 유도합니다.
shoark7.github.io
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
//start(출발지)에서 to(목적지)로 via(경유지)를 거쳐 총 N개의 원반 옮긴다.
hanoi(N,'1','3','2');
System.out.println(count);
System.out.println(sb);
}
private static void hanoi(int N, char start, char to, char via) {
//1개의 원반을 start에서 to로 옮긴다.
if(N==1)
move(1, start, to);
else {
hanoi(N - 1, start, via, to); //N-1개의 원반을 경유지로 옮긴다.
move(N, start, to); //N번째 원반을 목적지로 옮긴다.
hanoi(N - 1, via, to, start); //경유지에 있는 N-1개의 원반을 목적지로 옮긴다.
}
}
static int count = 0; //옮긴 횟수를 카운팅하는 변수
static StringBuilder sb = new StringBuilder();
private static void move(int N, char start, char to){
++count; //옮긴 횟수를 카운팅한다.
sb.append(start).append(' ').append(to).append('\n'); //
}
}