반응형
12-01 00:01
Today
Total
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
관리 메뉴

개발하는 고라니

[백준] 12904번 : A와 B 본문

Programming/백준

[백준] 12904번 : A와 B

조용한고라니 2021. 3. 28. 04:02
반응형
 

12904번: A와 B

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

www.acmicpc.net


[문자열 + BFS]

이 문제는 정공법으로 풀면 안된다. s -> t를 가는게 아닌, t -> s를 가는 것을 생각해야 한다. 전자로 풀면 메모리 초과가 날 수 있다. 따라서 t -> s로 가는 방법으로 풀어보자.

 

1. 문자열의 끝이 'A'이면 맨 끝 문자 삭제

2. 문자열의 끝이 'B'이면 맨 끝 문자 삭제 후 뒤집기

 

나는 Set을 이용해 방문을 표시했엇으나, 굳이 필요하지 않음을 느꼈다. 따라서 반복문의 종료 조건은 문자열의 길이가 s와 같고, 문자열이 s와 동일할 때 종료하도록 설정했다.

# Code </>

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;

public class Main {

    static String s, t;

    static boolean BFS(){

        int length = s.length();
        boolean possible = false;
        Queue<String> Q = new LinkedList<>();

        Q.add(t);

        while(!Q.isEmpty()){
            String cur = Q.poll();
            int curLen = cur.length();

            if(cur.length() < length) break;
            if(cur.length() == length && cur.equals(s)) return true;

            StringBuilder sb = new StringBuilder(cur);

            if(cur.charAt(curLen - 1) == 'A')
                sb.deleteCharAt(curLen-1);

            else if(cur.charAt(curLen - 1) == 'B'){
                sb.deleteCharAt(curLen-1);
                sb.reverse();
            }

            Q.add(sb.toString());
        }
        return possible;
    }

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

        s = br.readLine();
        t = br.readLine();

        System.out.println(BFS()? 1:0);
    }
}
반응형
Comments