완전 탐색 문제.
뭔가 순열을 활용한 문제라고 생각했으나, 갑자기 "어 이거! 뭔가 하노이의 탑 이다" 라는 생각이 들어 도전했다가 시간만 엄청 낭비한 문제. 결과적으로 미리 말하자면 하노이의 탑이랑 비슷한 부분은 있지만 하노이의 탑은 아니다. 하노이의 탑은 원판의 갯수에 따라 값이 달라지기 때문.
알고리즘 문제는 내가 생각한 식 가운데 가장 정답을 구하기 쉬운거로 가자. 최적화된 알고리즘 같은 거 아직 쓸 줄 모른다. 어떤 식을 쓰든 간에 문제를 해결한다에 집중하자.
문제 풀이는 다음과 같다.
import java.util.Scanner;
public class Main {
static boolean[][] visited = new boolean[201][201];
static boolean[] ans = new boolean[201];
static int A, B, C;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
A = sc.nextInt();
B = sc.nextInt();
C = sc.nextInt();
DFS(0, 0, C);
for(int i = 0; i<201; i++) if(ans[i]) System.out.print(i + " ");
}
public static void DFS(int a, int b, int c) {
if (visited[a][b]) return;
visited[a][b] = true;
if (a == 0) ans[c] = true;
int sum = a + b;
if (sum > B) DFS(sum - B, B, c);
else DFS(0, sum, c);
sum = b + a;
if (sum > A) DFS(A, sum - A, c);
else DFS(sum, 0, c);
sum = a + c;
if (sum > C) DFS(sum - C, b, C);
else DFS(0, b, sum);
sum = c + a;
if (sum > A) DFS(A, b, sum - A);
else DFS(sum, b, 0);
sum = b + c;
if (sum > C) DFS(a, sum - C, C);
else DFS(a, 0, sum);
sum = c + b;
if (sum > B) DFS(a, B, sum-B);
else DFS(a, sum,0);
}
}