분류: 재귀
▶문제
▶정답코드
//백준알고리즘 제출시 클래스 이름은 Main으로 바꿔야 됨
package recursion;
import java.util.Scanner;
public class p11729_hanoi {
//하노이탑.
public static StringBuilder sb = new StringBuilder();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sb.append((int)Math.pow(2,n)-1+"\n");//Math.pow는 실수로 나옴
hanoi(n, 1, 2, 3);
System.out.print(sb);
sc.close();
}
public static void hanoi(int n, int start, int mid, int to) {
if(n==1) {
sb.append(start+" "+to+"\n");
return;
}
//start 이동하려는 원판의 현위치, mid 거쳐가는 곳, to는 최종적으로 옮겨져야 하는 곳
hanoi(n-1, start, to, mid);//n-1개를 A에서 B로 이동 A:출발지 C:거치는곳 B:도착지
sb.append(start+" "+to+"\n");//n+1번째를 A에서 C로 이동
hanoi(n-1, mid, start, to);//n-1개를 2번에서 3번으로 이동 B출발 A지나쳐서 C로 도착
}
}
▶재귀를 사용해서 풀어야 한다.
작은 원판이 큰 원판 밑에 있으면 안된다.
n+1개의 원판이 있을때, n개를 2번에 옮기고
n+1번째를 3에 옮기고, n개를 3번쨰에 옮긴다.
▶ 먼저 하노이탑의 이동 횟수를 구해보자.
원판이 3개 일때
1->3 1->2 3->2 1->3 2->1 2->3 1->3
7번
[백준] 11729번 : 하노이 탑 이동 순서 - JAVA [자바]
www.acmicpc.net/problem/11729 11729번: 하노이 탑 이동 순서 세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이
st-lab.tistory.com
→하노이탑 이동 횟수와 이동 순서를 구하는 법이 잘 설명 되어있다ㅠ
▶알아보기 쉽게 start mid to대신 A B C를 넣어서 해보았다.
package recursion;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.util.Scanner;
//하노이탑 연습
public class hanoi {
public static StringBuilder sb = new StringBuilder();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
move(n, 1, 2, 3);
try(BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));){
bw.write(String.valueOf(sb));
}catch (Exception e) {e.printStackTrace();};
sc.close();
}
//ABC로 표현하니까 더 이해가 잘간다.
public static void move(int n, int A, int B, int C) {//A자리는 현재 자리from, B자리는 통과하는 자리via, C자리는 최종도착 자리to
if(n==1) {
sb.append(A+"->"+C+"\n");
return;//리턴 빼먹으면 안됨!!!
}
move(n-1, A, C, B);//1. n개를 A->B로 옮기기
sb.append(A+"->"+C+"\n");//2. n+1번쨰를 A->C로 옮기기
move(n-1, B, A, C);//3. n개를 B->C로 옮기기
}
}
▶이 문제는 이해했는데 다음에 보면 헷갈리는 문제같다... 이번에 정확히 해놓고 가자
채점결과
Scanner와 StingBuilder를 사용했다. 출력은 그냥 print로
링크 www.acmicpc.net/problem/11729
11729번: 하노이 탑 이동 순서
세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로
www.acmicpc.net
'백준알고리즘' 카테고리의 다른 글
백준알고리즘:p1002 터렛 (0) | 2021.04.04 |
---|---|
백준알고리즘:p3053 택시 기하학 (0) | 2021.04.02 |
백준알고리즘:p3009 네 번째 점 (0) | 2021.03.31 |
백준알고리즘:p1085 직사각형에서 탈출 (0) | 2021.03.31 |
백준알고리즘:p9020 골드바흐의 추측 (0) | 2021.03.31 |
댓글