본문 바로가기

백준/골드

[백준 9935번] 문자열 폭발 (C++)

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

 

9935번: 문자열 폭발

첫째 줄에 문자열이 주어진다. 문자열의 길이는 1보다 크거나 같고, 1,000,000보다 작거나 같다. 둘째 줄에 폭발 문자열이 주어진다. 길이는 1보다 크거나 같고, 36보다 작거나 같다. 두 문자열은 모

www.acmicpc.net

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

int main()
{
    ios_base::sync_with_stdio(0); 
	cin.tie(0);

    string s, boom;
    cin >> s >> boom;

    string tmp = "";

    for(int i=0; i<s.size(); i++)
    {
        bool check = 1; //boom 체크
        tmp+=s[i];
        if(tmp.size() < boom.size()) continue;
        for(int j=0; j<boom.size(); j++)
        {
            if(tmp[tmp.size()-boom.size()+j] != boom[j]) //boom 문자열 있는지 확인
            {
                check = 0; //boom 실패
                break;
            }
        }
        if(check) //boom 발생
        {
            for(int j=0; j<boom.size(); j++) tmp.pop_back(); //boom 문자열 삭제
        }
    }

    cout<< (tmp.empty() ? "FRULA" : tmp);
    return 0;
}

C++로 항상 풀기가 번거로웠던 문자열 문제다.

이번엔 그래도 괜찮은 편이었던 것 같다.

 

임시 문자열을 담을 tmp 를 선언하고 여기에 기존 문자열을 하나씩 더해준다.

이러다가 해당 문자열의 길이가 폭발 대상 문자열과 길이가 같거나 커지면 해당 문자열에 폭발 대상 문자열이 포함되어있는지 여부를 확인한다.

만약 있다면 체크용 bool 변수 check를 0으로 만든다.

 

이후 해당 변수를 확인하여 boom 발생 여부를 확인하고 발생했다며나 폭발 문자열의 길이만큼 pop_back을 실시하여 tmp 문자열에서 해당 문자열을 지워준다.

 

그리고 tmp 문자열이 비었는지 아닌지 여부를 확인하여 맞는 값을 출력해준다.