넘치게 채우기
[BOJ] 9935 - 문자열 폭발 본문
https://www.acmicpc.net/problem/9935
BOJ - 문자열 폭발
문제 유형: 스택, 문자열 처리
문제 난이도: Gold IV
시간 제한: 2초
메모리 제한: 128MB
문제
상근이는 문자열에 폭발 문자열을 심어 놓았다. 폭발 문자열이 폭발하면 그 문자는 문자열에서 사라지며, 남은 문자열은 합쳐지게 된다.
폭발은 다음과 같은 과정으로 진행된다.
- 문자열이 폭발 문자열을 포함하고 있는 경우에, 모든 폭발 문자열이 폭발하게 된다. 남은 문자열을 순서대로 이어 붙여 새로운 문자열을 만든다.
- 새로 생긴 문자열에 폭발 문자열이 포함되어 있을 수도 있다.
- 폭발은 폭발 문자열이 문자열에 없을 때까지 계속된다.
상근이는 모든 폭발이 끝난 후에 어떤 문자열이 남는지 구해보려고 한다. 남아있는 문자가 없는 경우가 있다. 이때는 "FRULA"를 출력한다.
폭발 문자열은 같은 문자를 두 개 이상 포함하지 않는다.
입력
첫째 줄에 문자열이 주어진다. 문자열의 길이는 1보다 크거나 같고, 1,000,000보다 작거나 같다.
둘째 줄에 폭발 문자열이 주어진다. 길이는 1보다 크거나 같고, 36보다 작거나 같다.
두 문자열은 모두 알파벳 소문자와 대문자, 숫자 0, 1, ..., 9로만 이루어져 있다.
출력
첫째 줄에 모든 폭발이 끝난 후 남은 문자열을 출력한다.
풀이
스택을 이용해서 풀 수 있다.
문자열과 폭발 문자열을 입력받는다. 그러고, 폭발 문자열을 뒤집는다.
순차적으로 문자열을 순회하면서, 한 글자씩 스택에 넣는다. 만약 폭발 문자열의 첫 글자와 같다면, 폭발을 시도한다:
임시 스택을 하나 만든다.
폭발 문자열의 글자를 순차적으로 스택의 톱과 비교하면서, 스택의 글자를 pop해서 임시 스택에 저장해둔다.
만약 같지 않다면, 임시 스택에 있는 요소들을 다시 되돌려놓는다.
폭발에 성공적이면, 복구하지 않는다.
최종적으로 스택의 남은 요소들을 다시 문자열로 이어붙여서, 뒤집는다.
만약 빈 문자열이라면, "FRULA"를 출력하고, 아니라면 남은 문자열을 출력해주면 된다.
코드
C++
#include <bits/stdc++.h>
using namespace std;
int m;
void booooom(stack<char> &stk, const string &bomb) {
stack<char> temp;
for (int i = 0; i < m; ++i) {
if (stk.empty() || stk.top() != bomb[i]) {
while (!temp.empty()) {
stk.push(temp.top());
temp.pop();
}
return;
}
temp.push(stk.top());
stk.pop();
}
}
int main(int argc, char *argv[]) {
string s;
string bomb;
cin >> s >> bomb;
m = bomb.size();
reverse(bomb.begin(), bomb.end());
char trigger = bomb[0];
stack<char> stk;
for (char ch : s) {
stk.push(ch);
if (ch == trigger) {
booooom(stk, bomb);
}
}
string ans = "";
while (!stk.empty()) {
ans += stk.top();
stk.pop();
}
reverse(ans.begin(), ans.end());
if (ans.empty())
cout << "FRULA\n";
else
cout << ans << "\n";
return 0;
}
'PS > BOJ' 카테고리의 다른 글
[BOJ] 10830 - 행렬 제곱 (0) | 2024.11.14 |
---|---|
[BOJ] 11054 - 가장 긴 바이토닉 부분 수열 (0) | 2024.11.12 |
[BOJ] 1987 - 알파벳 (0) | 2024.11.11 |
[BOJ] 5639 - 이진 검색 트리 (0) | 2024.11.10 |
[BOJ] 1504 - 특정한 최단 경로 (0) | 2024.11.09 |