반응형
https://www.acmicpc.net/problem/9935
9935번: 문자열 폭발
첫째 줄에 문자열이 주어진다. 문자열의 길이는 1보다 크거나 같고, 1,000,000보다 작거나 같다. 둘째 줄에 폭발 문자열이 주어진다. 길이는 1보다 크거나 같고, 36보다 작거나 같다. 두 문자열은 모
www.acmicpc.net
1.문제설명
INPUT
12ab112ab2ab
12ab
첫 째로 일반 문자열이 주어지고
두번째로 폭발하는 문자열이 주어진다.
1. 일반 문자열 내에 폭발 문자열이 있을 경우 폭발 문자열을 없애줘야한다.
2. 폭발 문자열을 없앤 결과 또 폭발문자열이 포함되어 있을 경우 다시 폭발문자열을 없애줘야한다.
1과 2를 문자열 내에 폭발문자열이 없을 때까지 반복한다.
2.접근방법[알고리즘]
그동안 습관적으로 STL을 사용하던 버릇에 긴장감을 주는 문제다.
스택을 직접 구현해야 가장 편하게 풀 수 있다.
입력받은 첫째 문자열을 돌면서 stack에 char 문자 하나씩 넣어주다가
stack의 가장 위 문자가 폭발 문자열의 마지막 문자와 동일하면
그 문자가 폭발 문자열을 이루고 있는지 확인하고,
폭발문자열이 발견되면 그만큼 pop 해주어야한다.
pop 해주는 건 p 변수를 폭발문자열의 크기 만큼 빼주면 쉽게 구현할 수 있다.
3.문제풀이코드 C++
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
char stack[1000001];
int p = 0;
string str;
string bomb;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> str;
cin >> bomb;
for (int i = 0; i < str.length(); i++) {
stack[p++] = str[i];
if (p >= bomb.length() && stack[p - 1] == bomb[bomb.length() - 1]) {
bool is_same = true;
for (int j = 0; j < bomb.length(); j++) {
if (bomb[j] != stack[p - bomb.length() + j]) {
is_same = false;
}
}
if (is_same) {
p -= bomb.length();
}
}
}
if (p == 0) {
cout << "FRULA" << '\n';
}
else {
for (int i = 0; i < p; i++) {
cout << stack[i];
}
cout << '\n';
}
return 0;
}
반응형
'Algorithm > problem' 카테고리의 다른 글
백준 3111번 : 검열 - deque 활용 코드 C++ (0) | 2022.02.12 |
---|---|
백준 2042번 : 구간 합 구하기 - Segment Tree C++ (0) | 2022.02.11 |
백준 2812번 : 크게 만들기 (0) | 2022.02.10 |
백준 11559번 : Puyo Puyo C++ 문제풀이코드 (0) | 2022.02.10 |
백준 16918번 : 봄버맨 C++ 코드 (0) | 2022.02.09 |