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

 

9935번: 문자열 폭발

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

www.acmicpc.net


    • 폭발 문자열이 ABC 일 경우, AAABCBCBC 처럼 연속적인 폭발이 일어나는 경우들이 있다.
    • 위의 경우, 가장 마지막에 나온 ABC 가 폭발하지 않으면 나머지 문자들도 처리될 수 없다.
    • 폭발 문자열에는 중복되는 문자가 없기 때문에, 스택에 문자들을 차례대로 담다가 폭발문자열의 맨 마지막 문자 C 가 나오게 될 경우 최근 문자를 검사해서 ABC 라면 스택에서 뺴준다.
    • 이런 식으로 처리를 하게 된다면, 연쇄적인 폭발도 스택에 남아있는 값들을 확인함으로써 처리된다.
    • 스택의 최근 S(폭발문자열의 길이) 개 원소에 직접 접근이 가능해야 하므로, 스택 대신 문자열을 이용한다.

#include <iostream>
#include <stack>

using namespace std;

int idx;
string line, target, answer;                                                // 스택을 사용하지만, 최근 sz 만큼 랜덤액세스가 가능해야 해서 문자열로 함

int main(void)
{
    cin >> line;
    cin >> target;
    int sz = target.size();

    for(int i = 0 ; i < sz - 1 ; i++) answer.push_back(line[i]);            // 검사 조건 따로 넣기 싫어서 아예 시작을 sz-1 부터 함
    for(int i = sz - 1 ; i < line.size() ; i++)
    {
        answer.push_back(line[i]);                                          // 일단 스택(문자열)에 무조건 넣어줌

        if(line[i] == target[sz - 1])                                       // 그런데 만약 폭발문자열의 마지막 문자와 같을 경우에
        {
            for(idx = 0 ; idx < sz ; idx++)                                 // 스택의 최근 sz 만큼과 폭발문자열을 비교해서
            {
                if(answer[answer.size() - sz + idx] != target[idx]) break;
            }
            if(idx == sz)                                                   // 만약 폭발한다면 sz 만큼 스택에서 pop 해서 폭발 처리
            {
                for(int n = 0 ; n < sz ; n++) answer.pop_back();
            }                                                               // 폭발 안한다면, 스택 그대로 유지하면서 다음 끝문자 나올때까지 반복
        }
    }

    cout << (answer.size() ? answer : "FRULA") << endl;
}

'PS > BOJ' 카테고리의 다른 글

[백준] 10819 : 차이를 최대로  (0) 2021.05.21
[백준] 13172 : Σ  (0) 2021.05.19
[백준] 11055 : 가장 큰 증가 부분 수열  (0) 2021.05.17
[백준] 1238 : 파티  (0) 2021.05.16
[백준] 1167 : 트리의 지름  (0) 2021.05.15

+ Recent posts