백준 12919 A와 B2 자바

꾸준하게 달리기~·2023년 6월 10일
0
post-thumbnail

문제는 다음과 같다.
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인 친구들만 보면 된다는 내용임)

profile
반갑습니다~! 좋은하루 보내세요 :)

0개의 댓글