본문 바로가기

알고리즘 문제풀이

[백준 9935]문자열 폭발

문제링크

www.acmicpc.net/problem/9935

 

9935번: 문자열 폭발

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

www.acmicpc.net

 

문제 난이도(solved.ac 기준)

Gold4

 

문제설명

1. 입력받은 문자열을 Char으로 하나씩 읽어서 새로운 공간에 쌓는다

2. 폭탄 문자열의 마지막 문자와 새로운 공간에 들어가는 문자가 같은 경우

3. 현재 새로운 공간에 쌓인 문자열의 길이가 폭탄 문자열 길이보다 작은 경우 폭탄은 존재하지 않는다

4. (3의 경우가 아니라면) 쌓여있는 문자열을 거꾸로 검사하며 폭탄과 같은지 비교한다

5. (4의 결과) 폭탄과 일치한다면 해당 부분을 삭제한다

6. 모든 검사가 끝나고 남은 문자열이 있으면 출력하고 없으면 FARULA를 출력한다

 

※ vector를 이용해서 문제풀이를 마치고보니 stack을 선언해서 풀이했어도 편했을거 같다는 생각을 했다 

 

 

소스코드

vc.erase(vc.<span

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
#include <string>
#include <vector>
using namespace std;
 
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
 
    string str, bomb;
    cin >> str >> bomb;
 
    vector<char> vc;
    for (char ch : str) {
        vc.push_back(ch);    //문자 넣기
 
        //넣은 문자가 폭탄의 마지막 문자와 같은 경우
        if (ch == bomb[bomb.size() - 1]) {
 
            //현재 쌓인 문자열 길이가 폭탄보다 작다면 폭탄이 존재하지 않는 경우이다
            if (vc.size() - bomb.size() < 0) {
                continue;
            }
 
            bool flag = true;
            int endIdx = vc.size() - 1;
            for (int i = 0; i < bomb.size(); i++) {
 
                //쌓여있는 문자와 폭탄 문자가 일치하지 않는 경우
                if (vc[endIdx - i] != bomb[bomb.size() - 1 - i]) {
                    flag = false;
                    break;
                }
            }
 
            //폭탄이 존재하는 경우 해당 부분 삭제
            if (flag) {
                vc.erase(vc.begin() + endIdx +1 - bomb.size(), vc.end());
            }
        }
    }
 
    if (vc.size() > 0) {
        for (int i = 0; i < vc.size(); i++) {
            cout << vc[i];
        }
        cout << '\n';
    }
    else {
        cout << "FRULA\n";
    }
 
    return 0;
}
cs