https://www.acmicpc.net/problem/1914
문제
원반의 개수가 주어질 때 최소 이동 순서와 이동 방법을 출력하라.
in : 3
out :
7
1 3
1 2
3 2
1 3
2 1
2 3
1 3
풀이
import java.util.Scanner;
public class Main {
static int count = 0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
StringBuilder sb = new StringBuilder();
q1914HanoiTower(n, '1', '2', '3', sb);
System.out.println(count);
System.out.println(sb);
}
public static void q1914HanoiTower(int n, char from, char mid, char to, StringBuilder sb) {
count++;
if (n == 1) {
sb.append(from + " " + to + "\n");
return;
}
q1914HanoiTower(n - 1, from, to, mid, sb);
sb.append(from + " " + to + "\n");
q1914HanoiTower(n - 1, mid, from, to, sb);
}
}
1. 원반이 한 개 라면, 바로 옮기면 됩니다.
2. 원반이 n 개라면, n번째 원반을 옮기기 위해 n-1 개의 원반을 mid(경유지) 로 옮겨야 합니다.
3. n-1을 중간으로 옮기고 n을 목적지로 옮깁니다.
4. 중간에 있는 n-1을 목적지로 옮겨야 합니다.
count는 Math.pow(2, N) - 1 이라고 합니다만, 수식 유추를 못해서 별도 static 변수 count를 사용했습니다.
근데 뭐 저 코드 메모리 초과 나옵니다. 다른 분도 저와 유사하게 푸신 분이 있던데 마찬가지로 메모리 초과 나옵니다.
Stack을 활용해서 풀고 싶었으나, 정답을 봐도 전혀 모르겠습니다. 어떻게 저런 순서로 stack에 넣어야 하는지 하나도 모르겠습니다. -_-
'SoftwareDo > 알고리즘(코테)' 카테고리의 다른 글
[Java] 자동완성이 없는 환경을 위한 총정리 (0) | 2024.05.09 |
---|---|
[Java] Tree와 BFS, DFS (child가 여러개) (1) | 2024.05.09 |
[Java] LinkedList로 구현한 Stack과 Queue (0) | 2024.05.08 |
baekjoon 7576. 토마토 (Java, 설명포함) (0) | 2024.05.08 |
leetcode 2. AddTwoNumbers (Java, 설명포함) (0) | 2024.05.08 |