문제 정의
입력
출력
Solution
STACK
을 이용하여 풀면 아주 간단하게 해결되는 문제다.
Backjoon사이트에서 제공하는 예제를 하나 보자.
입력
mirkovC4nizCC44
C4
먼저 mirkovC4
까지만 보면 C4
가 폭발 문자열이므로 사라진다.
그러면 mirkov
가 남고 나머지 nizCC44
를 이어붙여
mirkovnizCC44
가 된다.
여기서 다시
mirkovnizCC4
까지만 보게 되면 제일 끝에 폭발 문자열이 있으므로 터쳐준다.
mirkovnizC
가남고 뒤에 문자열인 4
를 다시 붙여주면 다음과 같다.
mirkovnizC4
여기서도 역시 마지막 문자열이 폭발 문자열이므로 터쳐준다. 그럼 남은 문자열은 다음과 같다.
mirkovniz
더이상 폭발 문자열이 포함되지 않았으므로 mirkovniz
를 출력하면 된다.
위의 순서를 정리해보면 다음과 같다.
mirkovnizC
-> mirkovnizC4
-> mirkovniz
정답 코드
#include <iostream>
using namespace std;
char arr[1000000];
// 폭발할 문자열과 현재 저장한 문자열의 끝에있는 문자열을 비교
bool compare(string key, int p) {
string a = ""; // 비교할 문자열 생성
for (int i = key.length(); i > 0; i--) {
a += arr[p - i];
}
if (a == key) return 1;
else return 0;
}
int main() {
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
string temp, key; // key - 폭발 문자열, temp - 탐색할 문자열
cin >> temp >> key;
int p = 0; // 문자열의 개수를 확인할 변수
// 문자열을 처음부터 끝까지 탐색
for (int i = 0; i < temp.length(); i++) {
arr[p++] = temp[i];
if (p >= key.length()) {
if (compare(key, p)) // 만약 문자열의 끝이 폭발 문자열인 경우
p -= key.length(); // 폭파
}
}
if (!p) // 남아있는 문자열의 개수 확인
cout << "FRULA\n";
else { // 남아있는 문자열 존재하므로 출력
for (int i = 0; i < p; i++) {
cout << arr[i];
}
cout << '\n';
}
return 0;
}