문제 이해
하노이 탑의 이동 횟수를 수학 공식으로 나타내면 다음과 같다.
만약 원판이 2개일때의 이동 과정
원판 1 을 1---->2로 이동
원판 2 를 1---->3으로 이동
원판 1 을 2---->3으로 이동
만약 원판이 N개일때 이동 과정
원판 N-1 을 1---->2로 이동
원판 N 를 1---->3으로 이동
원판 N-1 을 2---->3으로 이동
문제 해결
매개변수 h1은 출발지, h3는 목적지로 표현
public static void move(int n,int h1,int h2, int h3) {
if(n==1){
sb.append(h1+" "+h3+"\n");
return;
}
move(n-1,h1,h3,h2); //A --> B
sb.append(h1+" "+h3+"\n"); // A --> C
move(n-1,h2,h1,h3); // B --> C
}
이러면
만약 원판이 N개일때 이동 과정
원판 N-1 을 1---->2로 이동
원판 N 를 1---->3으로 이동
원판 N-1 을 2---->3으로 이동
위 과정을 구현 가능하다.
<전체 코드>
import java.util.Scanner;
import java.util.Stack;
public class Problem11729 {
static int N;
public static StringBuilder sb = new StringBuilder();
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
N = scanner.nextInt();
sb.append((int)Math.pow(2,N)-1).append('\n');
move(N,1,2,3);
System.out.println(sb);
}
public static void move(int n,int h1,int h2, int h3) {
if(n==1){
sb.append(h1+" "+h3+"\n");
return;
}
move(n-1,h1,h3,h2); //A --> B
sb.append(h1+" "+h3+"\n"); // A --> C
move(n-1,h2,h1,h3); // B --> C
}
}
고찰
아직 재귀함수에 익숙하지 않아서 많이 어려웠다.
재귀함수 문제를 많이 풀어야겠다.
'알고리즘 > 백준' 카테고리의 다른 글
백준-1780번/종이의 개수(java) (0) | 2024.12.29 |
---|---|
백준-11728번/배열 합치기 (java) (2) | 2024.10.07 |
백준-10816번/숫자 카드 2 (java) (0) | 2024.10.06 |
백준-1541번/잃어버린 괄호 (java) (2) | 2024.10.05 |
백준-10610번/30 (java) (1) | 2024.10.04 |