출처: https://3months.tistory.com/307 [Deep Play]

백준/String

[BOJ] 9935 문자열 폭발

코딩하는 랄뚜기 2022. 2. 18. 21:46

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

 

9935번: 문자열 폭발

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

www.acmicpc.net

문제

상근이는 문자열에 폭발 문자열을 심어 놓았다. 폭발 문자열이 폭발하면 그 문자는 문자열에서 사라지며, 남은 문자열은 합쳐지게 된다.

폭발은 다음과 같은 과정으로 진행된다.

  • 문자열이 폭발 문자열을 포함하고 있는 경우에, 모든 폭발 문자열이 폭발하게 된다. 남은 문자열을 순서대로 이어 붙여 새로운 문자열을 만든다.
  • 새로 생긴 문자열에 폭발 문자열이 포함되어 있을 수도 있다.
  • 폭발은 폭발 문자열이 문자열에 없을 때까지 계속된다.

상근이는 모든 폭발이 끝난 후에 어떤 문자열이 남는지 구해보려고 한다. 남아있는 문자가 없는 경우가 있다. 이때는 "FRULA"를 출력한다.

폭발 문자열은 같은 문자를 두 개 이상 포함하지 않는다.

입력

첫째 줄에 문자열이 주어진다. 문자열의 길이는 1보다 크거나 같고, 1,000,000보다 작거나 같다.

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

두 문자열은 모두 알파벳 소문자와 대문자, 숫자 0, 1, ..., 9로만 이루어져 있다.

출력

첫째 줄에 모든 폭발이 끝난 후 남은 문자열을 출력한다.


풀이

  1. 주어진 문자열을 한 글자씩 벡터에 넣는다.
  2. 벡터의 사이즈가 폭탄의 사이즈보다 크거나 같으면 벡터의 끝부분에 폭탄이 있는지 확인한다.
  3. 만약 폭탄이 있다면 벡터에서 폭탄을 제거한다.

문제를 풀 때 벡터의 끝부분에 폭탄이 있는지 확인하는 과정 때문에 시간 초과가 발생 할 줄 알았지만 폭탄의 최대 크기가 36이므로 발생하지 않았다.


코드

#include <string>
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <queue>
#include <stack>
#include <climits>

#define SWAP(a, b, type) do { \
    type temp; \
    temp = a;  \
    a = b;     \
    b = temp;  \
} while (0)

#define INF 1000000000
#define endl '\n'
#define ll long long

using namespace std;

vector<char> v;
deque<char> dq;
string s;
string bomb;


void input() {
    cin>>s>>bomb;
}

void init() {
}


void solution(){
    for(int i=0;i<s.size();i++){
        bool flag=false;
        //주어진 문자열을 한글자식 벡터에 넣는다.
        v.push_back(s[i]);
        
        if(v.size()>=bomb.size()){
            //벡터의 끝부분이 bomb과 똑같은지 확인한다.
            for(int j=0;j<bomb.size();j++){
                if(v[v.size()-bomb.size()+j]!=bomb[j]){
                    flag=true;
                    break;
                }
            }
            //만약 bomb과 똑같다면 벡터에서 bomb을 제거해줘야 한다.
            if(!flag){
                for(int j=0;j<bomb.size();j++){
                    v.pop_back();
                }
            }
        }
    }
    
    if(v.empty()){
        cout<<"FRULA";
    }else{
        for(int i=0;i<v.size();i++) cout<<v[i];
    }
}

int main()
{
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    input();
    solution();
    return 0;
}

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

[BOJ] 5525 IOIOI  (0) 2022.03.11
[BOJ] 2154 수 이어 쓰기 3  (0) 2021.09.07
[BOJ] 1748 수 이어 쓰기 1  (0) 2021.09.07
[BOJ] 1515 수 이어 쓰기  (0) 2021.09.06
[BOJ] 5430 AC  (0) 2021.09.06