[BOJ]12904 AとB-JAVA


📚 Problem


12904およびB


📝 Solution


Key Idea
  • Aを追加する演算と文字列を逆さまにして、後にBを追加する演算を逆に
  • と考える.
  • Tでは、上記の演算を逆方向に実行し、これらの演算がSであるかどうかを確認する.
  • 文字列を反転するプロセスは、booleanをグローバル変数として宣言し、ヘッダの前がtrueであり、末尾の前がfalseであると考えられる.
  • T文字列の末尾のCharをチェックし、A面は削除のみ、B面は削除し、boolean
  • を変更します.
  • の演算により、T文字列の長さとS文字列の長さが等しい場合に、equals()検査
  • を行う.
    private static String remove(String T) {
        if(head){
            if (T.charAt(T.length() - 1) == 'B')
                head = false;
            return T.substring(0, T.length() - 1);
        }
        else {
            if (T.charAt(0) == 'B')
                head = true;
            return T.substring(1);
        }
    }

    💻 Code

    import java.util.Scanner;
    
    public class Main {
        private static boolean head;
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
    
            String S = scanner.next();
            String T = scanner.next();
            head = true;
    
            while (S.length() < T.length())
                T = remove(T);
    
            if(!head)
                T = reverse(T);
    
            if(S.equals(T))
                System.out.println(1);
            else
                System.out.println(0);
    
            scanner.close();
        }
    
        private static String remove(String T) {
            if(head){
                if (T.charAt(T.length() - 1) == 'B')
                    head = false;
                return T.substring(0, T.length() - 1);
            }
            else {
                if (T.charAt(0) == 'B')
                    head = true;
                return T.substring(1);
            }
        }
    
        private static String reverse(String T) {
            StringBuilder builder = new StringBuilder(T);
            return builder.reverse().toString();
        }
    }