되게 간단한 문제라서 이게 왜 골드5지? 싶었다. 그런데 함정이 있었다. 바로 시간복잡도다.
S -> T
로 갈 때 두가지 경우가 있고 입력 조건에 따라서 S
가 1
이고 T
가 1000
일 경우 최대 2^1000
의 시간복잡도를 가진다. 그래서 이렇게 풀면 당연히 틀린다.
처음에는 S -> T
로 가는 과정 중 중간 종료 조건을 생성해야겠다는 생각을 했다. 그런데 S -> T
과정에서 중간에 유망도를 판단하기는 어려웠다.
그래서 좀 더 고민하다가 결국 생각해냈다.
T -> S
로 가는 역발상
T -> S
로 가는 과정을 구현하면 된다. 얼핏보면 이것도 2^1000
의 시간복잡도 아니야? 라고 할 수 있지만 T -> S
로 간다고 생각하면 두가지 경우 중 하나의 경우만 일어난다.
T
의 끝자리가 A
인 경우 : T의 끝자리에서 A
를 뺀다.
T
의 끝자리가 B
인 경우 : T의 끝자리에서 B
를 뺀 후 문자열을 뒤집는다.
T의 끝자리는 A
또는 B
이므로 최대 시간복잡도는 1000
이다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Stack;
import java.util.StringTokenizer;
public class Main {
//12904번
public static void main(String[] args) throws Exception {
// 입력받기
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
Stack<String> stack = new Stack<>();
String from = br.readLine();
String to = br.readLine();
int fromLength = from.length();
int result = 0;
stack.push(to);
while(true) {
String now = stack.pop();
if(now.equals(from)) {
result = 1;
break;
}
else if(now.length()>fromLength) {
if(now.charAt(now.length()-1) == 'A') {
stack.push(now.substring(0, now.length()-1));
}
//리버스
else {
stack.push(reverse(now.substring(0, now.length()-1)));
}
}else if(stack.size() ==0) break;
}
bw.write(result+"\n");
bw.flush();
}
static String reverse(String s) {
String newS ="";
for(int i=s.length()-1; i>=0; i--) {
newS += s.charAt(i);
}
return newS;
}
}