Algorithm/백준

[백준][C++] 9935번: 문자열 폭발 <198>

샤아이인 2022. 3. 9.

직접 풀어보고 올리는 코드입니다. 지적이나 더 좋은 방향에 대한 댓글은 항상 환영합니다.

 

 

9935번: 문자열 폭발

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

www.acmicpc.net

생각의 흐름

처음에는 Stack을 직접 사용하면서 해결하려 했는데, 맨 뒤 문자열을 삭제하는 과정이 조금 힘들어 졌다.

따라서 다른 분의 글을 좀 참고하여 String 자체를 stack으로 생각하고 해결하는 방식으로 풀었다.

 

우선 비어있는 res라는 String에 한 글자씩 넣어 주다가, 방금 들어온 글자가 폭발 문자열의 마지막 글자와 같은경우 res에 담겨있는 이전 글자들도 폭발 문자랑 모두 비교하여 문자열의 마지막 n글자 (n = 폭발 문자열의 길이)가 폭발 문자열과 같다면, 뒷부분을 삭제하는 방식으로 해결하였다.

 

나의 코드

 

#include <bits/stdc++.h>
using namespace std;

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

    string s, bomb;
    cin >> s >> bomb;

    string res = "";

    int bombIdx = bomb.length() - 1;
    for (int i = 0; i < s.length(); i++) {
        res += s[i];
        if (res[res.length() - 1] == bomb[bombIdx]) {
            if (res.length() >= bomb.length()) {
                int cnt = 1;

                for (int j = bombIdx - 1; j >= 0; j--) {
                    if (res[res.length() - (bombIdx - j) - 1] == bomb[j]) {
                        cnt++;
                    }
                }

                if (bomb.length() == cnt) {
                    for (int b = 0; b < bomb.length(); b++) {
                        res.pop_back();
                    }
                }
            }
        }
    }


    if (res.length() > 0) {
        cout << res << endl;
    } else {
        cout << "FRULA" << endl;
    }

    return 0;
}

댓글