11729번: 하노이 탑 이동 순서
세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로
www.acmicpc.net
[문제 풀이 해결 방법]
** 원판 2개인 경우 == hanoi(2, A, B, C)
** 원판 3개인 경우 == hanoi(3, A, B, C)
hanoi(3, A, B, C)에는 hanoi(2, A, B, C)가 두 번 포함되어 있다. 이를 그림으로 다시 나타내면
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
System.out.println((int)(Math.pow(2, N)-1));
hanoi(N, 1, 2, 3);
}
public static void hanoi(int N, int start, int via, int end){
if(N == 1)
System.out.println(start+" "+end);
else{
hanoi(N-1, start, end, via);
System.out.println(start+" "+end);
hanoi(N-1, via, start, end);
}
}
}
이렇게 하면 시간초과가 뜬다. 해결방법은 아래처럼 출력을 StringBuilder로 하는것!
import java.util.Scanner;
public class Main {
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)).append('\n');
hanoi(N, 1, 2, 3);
System.out.println(sb);
}
public static void hanoi(int N, int start, int via, int end){
if(N == 1)
sb.append(start+" "+end).append('\n');
else{
hanoi(N-1, start, end, via);
sb.append(start+" "+end).append('\n');
hanoi(N-1, via, start, end);
}
}
}
'1d-1c > BOJ' 카테고리의 다른 글
1712_손익분기점 (JAVA) (0) | 2020.10.04 |
---|---|
2798_블랙잭 (JAVA) (0) | 2020.10.03 |
10815_숫자 카드 (JAVA) (0) | 2020.09.18 |
2805_나무 자르기 (JAVA) (C++) (0) | 2020.09.18 |
1920_수 찾기 (JAVA) (C++) (0) | 2020.09.15 |