본문 바로가기

백준/골드

[백준 12904번] A와 B (C++)

문제링크 : https://www.acmicpc.net/problem/12904

 

12904번: A와 B

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

www.acmicpc.net

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;

string S, T;
int result;

void func()
{
    while(1)
    {
        if(S==T) 
        {
            result = 1;
            break;
        }
        else if (S.size()==T.size()) break;

        if(T[T.size()-1]=='A') T.pop_back(); //뒤 A제거
        else //뒤 B제거 후 뒤집기
        {
            T.pop_back();
            reverse(T.begin(), T.end());
        }
    }
    
}

int main()
{
    ios_base::sync_with_stdio(0); 
	cin.tie(0);
    
    cin >> S >> T;
    func();
    cout << result;
}

 

처음에 재귀로 풀었다가 시간초과가 발생했다.

재귀로 할 경우 매 탐색마다 reverse 함수 사용인한 시간 초과로 인해 다른 방법으로 풀어야 한다.

 

재귀로 풀 경우 S를 기준으로 만들어가는 과정을 생각했지만, T를 기준으로 S를 만드는 방법으로 풀면 수월하다.

주어진 연산을 거꾸로 생각하여 T의 맨 뒤가 A면 제거하고 B면 B를 제거후 뒤집어준다.

이를 S와 T가 같거나, S의 사이즈가 T의 사이즈가 같아질때까지 반복한다.

'백준 > 골드' 카테고리의 다른 글

[백준 15486번] 퇴사 2 (C++)  (0) 2023.11.16
[백준 1083번] 소트 (C++)  (0) 2023.11.14
[백준 5052번] 전화번호 목록 (C++)  (0) 2023.11.11
[백준 14226번] 이모티콘 (C++)  (0) 2023.11.09
[백준 18116번] 로봇 조립 (C++)  (0) 2023.11.08