본문 바로가기
Algorithm/백준

[백준] 12919번 : A와 B 2 java

by LeeGangEun 2023. 5. 18.

문제 설명

수빈이는 A와 B로만 이루어진 영어 단어 존재한다는 사실에 놀랐다. 대표적인 예로 AB (Abdominal의 약자), BAA (양의 울음 소리), AA (용암의 종류), ABBA (스웨덴 팝 그룹)이 있다.

이런 사실에 놀란 수빈이는 간단한 게임을 만들기로 했다. 두 문자열 S와 T가 주어졌을 때, S를 T로 바꾸는 게임이다. 문자열을 바꿀 때는 다음과 같은 두 가지 연산만 가능하다.

  • 문자열의 뒤에 A를 추가한다.
  • 문자열의 뒤에 B를 추가하고 문자열을 뒤집는다.

주어진 조건을 이용해서 S를 T로 만들 수 있는지 없는지 알아내는 프로그램을 작성하시오. 


입력

첫째 줄에 S가 둘째 줄에 T가 주어진다. (1 ≤ S의 길이 ≤ 49, 2 ≤ T의 길이 ≤ 50, S의 길이 < T의 길이)


출력

S를 T로 바꿀 수 있으면 1을 없으면 0을 출력한다.

 

예제


풀이

브루토포스 문제이다. 이 문제는 T의 길이가 최대 50까지 이기 때문에
모든 경우의 수를 따지려면 시간초과가 날 수 있다.
그래서 S에서 T를 만드는게 아니라
T에서 S로 갈 수 있는지를 체크하는게 좋다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

    private static String S;
    private static String T;
    private static boolean check;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        S = br.readLine();
        T = br.readLine();

        dfs(T);
        System.out.println(check ? 1 : 0);
    }

    private static void dfs(String a) {
        if (a.length() < S.length() || check) return;

        if (a.equals(S)) {
            check = true;
            return;
        }

        // 문자열의 뒤에 B를 추가하고 문자열을 뒤집는다.
        // 라는 조건이 부합하려면 첫번째 글자가 B인지 체크하면 된다.
        // 맞다면 먼저 뒤집어주고 맨 뒤 글자 삭제

        if (a.charAt(0) == 'B') {
            dfs(new StringBuilder(a).reverse().substring(0, a.length() - 1));
        }
		
        // 맨 뒤 글자가 A이면 조건에 부합
        if (a.charAt(a.length() - 1) == 'A')
            dfs(a.substring(0, a.length() - 1));
    }
}