Skip to content

Conversation

@LiiNi-coder
Copy link
Contributor

🧷 문제 링크

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

🧭 풀이 시간

110 분

👀 체감 난이도

✏️ 문제 설명

  • S문자열과 T문자열이 주어짐. 이들은 A와 B로만 이루어져있고, S문자열에서 두가지 연산이 가능함. 1.맨끝에 A병합, 2. 맨끝에 B병합 후 리버스.
  • 이때 S문자열에서 연산들을 사용하여 T문자열을 만들수있는지를 판단하는 문제

🔍 풀이 방법

  • DFS. 단, T->S로 하여 백트래킹을 자연스레 적용

⏳ 회고

  • 첨엔 S->T로 BFS로 하였다가 엄청난 뻘짓을했다. 시간초과를 줄여보려고 A연속길이, B연속길이를 구해서, 백트래킹을 하여 분기를 최대한 쳐내는 방식으로 했지만, 그럼에도 안되서 결국 다른사람의 풀이를 보았다.
  • S->T가 아니라, T->S로 하면 자연스레 백트래킹이 된다는 것이다.
  • 다음부터 S->T로 만드는 문제일때, 역으로도 생각해보는 습관을 기르자
  • 뻘짓한 코드는 코멘트로 달겠다.

@LiiNi-coder LiiNi-coder added the hint 💡 반례를 참고했거나 힌트를 얻고 풀었을 때 label Aug 27, 2025
@ShinHeeEul ShinHeeEul merged commit b8e9457 into main Aug 27, 2025
1 check passed
@LiiNi-coder
Copy link
Contributor Author

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main{

    private static BufferedReader br;
    private static String T;
    private static String S;
    private static int[] NABOfT;
    private static int[] NABOfS;
    private static int neededNB;
    private static int neededNA;
    private static int na;
    private static int nb;
    private static int[] perm;
    static class QE{
        String s;
        int na;
        int nb;
        QE(String s, int na, int nb){
            this.s = s;
            this.na = na;
            this.nb = nb;
        }
    }

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

        // 입력
        S = br.readLine();
        T = br.readLine();

        // nABOfS와 nABOfT를 구함
        // S와 T의 각각 maxA, minA, maxB, minB 를 구함
        NABOfT = new int[2];
        int t1 = 0;
        int t2 = 0;
        for(char c: S.toCharArray()){
            if(c == 'A')
                t1++;
            else
                t2++;
        }
        NABOfS = new int[]{t1, t2};

        t1 = 0;
        t2 = 0;
        for(char c: T.toCharArray()){
            if(c == 'A')
                t1++;
            else
                t2++;
        }
        NABOfT = new int[]{t1, t2};


        na = neededNA = NABOfT[0] - NABOfS[0];
        nb = neededNB = NABOfT[1] - NABOfS[1];

        boolean isFind = false;
        var q = new ArrayDeque<QE>();
        q.add(new QE(S, na, nb));
        while(!q.isEmpty()){
            QE temp =  q.poll();
            if(temp.s.equals(T)){
                isFind = true;
                break;
            }
            var sb = new StringBuilder(temp.s);
            var a = temp.na;
            var b = temp.nb;
            if(a != 0){
                sb.append('A');
                q.add(new QE(sb.toString(), a - 1, b));
            }
            sb = new StringBuilder(temp.s);
            if(b != 0){
                sb.append('B');
                sb.reverse();
                q.add(new QE(sb.toString(), a, b-1));
            }
        }
        System.out.println(isFind? 1:0);
        br.close();
    }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

hint 💡 반례를 참고했거나 힌트를 얻고 풀었을 때

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants