문제는 다음과 같다.
https://www.acmicpc.net/problem/12919
풀이는 다음과 같다.
이해하기 쉽게 주석 달아놓았다.
import java.io.*;
import java.util.*;
public class Main {
static boolean answer; //정답 여부 체크해줄 boolean
static String S, T;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
//문자열 뒤 A 추가해서 혹은 문자열 뒤 B 추가해서 뒤집는 과정을 거쳐 S 가 T 가 될 수 있다면 1, 아니면 0.
//생각해보기. S에서 T로 가기 위해선, 모든 경우마다 한글자씩 늘어나는데 위와 같이 두개의 경우가 생김
//하지만 T에서 S로 가려면, 제약 조건이 있음.
//바로 문자열 뒤 A 추가 = 맨 뒤가 A인 친구
//문자열 뒤 B 추가 후 뒤집개 = 맨 뒤가 B인 친구임.
//해당 내용으로 인해, T에서 S로 가는 여정은 무조건 경우의 수가 두개가 아니라 더 적음.
//14행과 15행의 내용이 48행~51행의 내용임.
S = br.readLine();
T = br.readLine();
answer = false;
goToShort(T);
//돌고 난 후엔
if(answer) bw.write(String.valueOf(1));
else bw.write(String.valueOf(0));
bw.flush();
bw.close();
}
//재귀 매서드
static void goToShort(String K) {
//언제 끝나는지 = 들어온 문자열 길이가 S의 길이와 같으면, equals인지 확인한 후 boolean answer바꿔준 후 리턴한다.
if(answer) return;
if(K.length() == S.length()) {
if(K.equals(S)) {
answer = true;
return;
}
}
//재귀함수 들어가면서 해줘야 할 로직은 무엇인지
//들어온 문자열 맨 뒤값이 A라면 빼주고 다시넣기
if(K.endsWith("A")) goToShort(K.substring(0, K.length()-1));
//맨 앞값이 B라면 빼주고 뒤집고 다시넣기
if(K.startsWith("B")) goToShort(back(K.substring(1)));
}
//문자열 뒤집어주는 매서드
static String back(String A) {
String backA = "";
for(int i = A.length() ; i >= 1 ; i--) {
backA += A.substring(i-1, i);
}
return backA;
}
}
문자열 뒤 A 추가해서 혹은
문자열 뒤 B 추가해서 뒤집는 과정을 거쳐
S 가 T 가 될 수 있다면 1, 아니면 0을 출력하는 문제이다.
생각해 보면,
S에서 T로 가기 위해선,
모든 경우마다 무조건 한글자씩 늘어날 수 있어서,
무조건 하나당 두개의 경우가 생김
하지만, T에서 S로 가려면, 제약 조건이 있다.
바로
문자열 뒤 A 추가 = 맨 뒤가 A인 친구로 확정이고,
문자열 뒤 B 추가 후 뒤집기 = 맨 앞이 B인 친구로 확정이다.
해당 내용으로 인해,
T에서 S로 가는 여정은 무조건 경우의 수가 두개가 아니라 더 적다.
(T에서 S로 가는 과정은, 맨 뒤가 A인 친구 혹은 맨 앞이 B인 친구들만 보면 된다는 내용임)