본문 바로가기
algorithm/Baekjoon Online Judge

[BOJ] 12904 A와 B(Java)

by eo_neunal 2022. 3. 21.

문제

https://www.acmicpc.net/problem/12904

 

12904번: A와 B

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

www.acmicpc.net

풀이

- T의 마지막 인덱스와 S의 길이를 저장

- T의 마지막 인덱스의 글자를 가져와 저장하고, T를 0~마지막 인덱스-1까지 자름

- T의 마지막 글자가 B이면 T를 뒤집음

- 2~3번째 과정을 T의 길이와 S의 길이가 같을 때까지 반복

- T와 S가 같으면 1, 아니면 0을 출력

소스 코드

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

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        String s = bufferedReader.readLine();
        String t = bufferedReader.readLine();
        int lastIndex = t.length() - 1;
        int sLength = s.length();
        while (t.length() != sLength) {
            char lastCharacter = t.charAt(lastIndex);
            t = t.substring(0, lastIndex--);
            if (lastCharacter == 'B') {
                t = new StringBuffer(t).reverse().toString();
            }
        }

        if (t.equals(s)) {
            System.out.println(1);
        } else {
            System.out.println(0);
        }
    }
}

 

문자열을 자르지 않고, 인덱스를 이용해 개선

- 인덱스가 마지막이면 true, 마지막이 아니면(처음이면) false를 담을 isLast 변수 선언

- isLast가 참이면 마지막 문자 하나를 삭제하고, 거짓이면 첫 문자를 삭제

- 문자열이 B이면 isLast를 반전

- 가장 마지막 삭제 문자에 대한 반전 여부가 반영되지 않았으므로 반복 종료 후 뒤집기 여부 확인

    - isLast가 거짓이면 마지막 글자가 B였다는 의미이므로 문자열을 뒤집음

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

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        String s = bufferedReader.readLine();
        String t = bufferedReader.readLine();
        int lastIndex = t.length() - 1;
        int sLength = s.length();
        boolean isLast = true;
        while (t.length() != sLength) {
            char lastCharacter;
            if (isLast) {
                lastCharacter = t.charAt(lastIndex);
                t = t.substring(0, lastIndex);
            } else {
                lastCharacter = t.charAt(0);
                t = t.substring(1);
            }
            lastIndex--;

            if (lastCharacter == 'B'){
                isLast = !isLast;
            }
        }

        if (!isLast) {
            t = new StringBuffer(t).reverse().toString();
        }

        if (t.equals(s)) {
            System.out.println(1);
        } else {
            System.out.println(0);
        }
    }
}

 

Deque을 이용해 개선

- 인덱스 사용과 마찬가지로 isLast에 문자열의 마지막 문자를 자를지, 첫 문자를 자를지 결정

- Deque를 이용해 문자열을 자르지 않고, 요소 제거를 사용

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Deque;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        String s = bufferedReader.readLine();
        String t = bufferedReader.readLine();
        Deque<Character> deque = new ArrayDeque<>();
        for (int i = 0; i < t.length(); i++) {
            deque.offer(t.charAt(i));
        }
        int sLength = s.length();
        boolean isLast = true;
        while (deque.size() != sLength) {
            char lastCharacter;
            if (isLast) {
                lastCharacter = deque.removeLast();
            } else {
                lastCharacter = deque.removeFirst();
            }

            if (lastCharacter == 'B') {
                isLast = !isLast;
            }
        }

        StringBuilder stringBuilder = new StringBuilder();

        if (isLast) {
            while (deque.size() > 0) {
                stringBuilder.append(deque.removeFirst());
            }
        } else {
            while (deque.size() > 0) {
                stringBuilder.append(deque.removeLast());
            }
        }

        if (stringBuilder.toString().equals(s)) {
            System.out.println(1);
        } else {
            System.out.println(0);
        }
    }
}