https://www.acmicpc.net/problem/9935
문제
상근이는 문자열에 폭발 문자열을 심어 놓았다. 폭발 문자열이 폭발하면 그 문자는 문자열에서 사라지며, 남은 문자열은 합쳐지게 된다.
폭발은 다음과 같은 과정으로 진행된다.
- 문자열이 폭발 문자열을 포함하고 있는 경우에, 모든 폭발 문자열이 폭발하게 된다. 남은 문자열을 순서대로 이어 붙여 새로운 문자열을 만든다.
- 새로 생긴 문자열에 폭발 문자열이 포함되어 있을 수도 있다.
- 폭발은 폭발 문자열이 문자열에 없을 때까지 계속된다.
상근이는 모든 폭발이 끝난 후에 어떤 문자열이 남는지 구해보려고 한다. 남아있는 문자가 없는 경우가 있다. 이때는 "FRULA"를 출력한다.
폭발 문자열은 같은 문자를 두 개 이상 포함하지 않는다.
입력
첫째 줄에 문자열이 주어진다. 문자열의 길이는 1보다 크거나 같고, 1,000,000보다 작거나 같다.
둘째 줄에 폭발 문자열이 주어진다. 길이는 1보다 크거나 같고, 36보다 작거나 같다.
두 문자열은 모두 알파벳 소문자와 대문자, 숫자 0, 1, ..., 9로만 이루어져 있다.
출력
첫째 줄에 모든 폭발이 끝난 후 남은 문자열을 출력한다.
풀이
- 주어진 문자열을 한 글자씩 벡터에 넣는다.
- 벡터의 사이즈가 폭탄의 사이즈보다 크거나 같으면 벡터의 끝부분에 폭탄이 있는지 확인한다.
- 만약 폭탄이 있다면 벡터에서 폭탄을 제거한다.
문제를 풀 때 벡터의 끝부분에 폭탄이 있는지 확인하는 과정 때문에 시간 초과가 발생 할 줄 알았지만 폭탄의 최대 크기가 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 |