알고리즘 문제풀이

[백준 9935] 문자열 폭발 (C++)

SiO2whocode 2024. 7. 3. 17:04
728x90

https://www.acmicpc.net/problem/9935

 

평범한 문자열1개와 폭발 문자열1개를 입력받고, 평범한 문자열에서 폭발 문자열은 모두 사라지게 한 결과를 출력하는 문제

폭발문자열이 사라짐으로 인해 합쳐진 문자열이 또다시 폭발 문자열을 포함한다면 그것도 폭발시켜야함!

 

접근방법

Swift String의 range와 replacesubrange를 사용해보았는데 대차게 시간초과 떠서,,얌전히 C++로 풀었다네요ㅋㅋ,,

Stack문제는 Stack으로..

접근방법을 한마디로 요약하면 "Stack에 문자를 하나 넣을 때 마다 폭발물을 검사하자"입니다.

평범한 문자열을 모두 순회하면서 한글자씩 Stack에 넣을 건데요, 이때 한글자가 들어갈 때마다

폭발물 문자열 길이 만큼 스택 상단의 문자열을 뽑아서 폭발물인지 확인하고, 맞으면 다 빼버리고, 다르면 그대로 둡니다.

 

이때 vector to string 방식으로는 string 생성자를 썼습니다. 아주 요긴했습니다.

string 변수명(vector시작인덱스, vector끝인덱스); 이러면 vector에서 내가 원하는 범위만큼의 문자가 string변수에 담아집니다.

 

자 그럼 코드 보시죠

 

소스코드

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main(){
    string str;
    string bomb;
    
    cin >> str >> bomb;
    
    vector<char> stack;
    
    int strlen = str.length();
    for(int i = 0 ; i < strlen ; i++){
        stack.push_back(str[i]);
        //validate
        if(stack.size() >= bomb.length()){
            string candidate(stack.end()-bomb.length(), stack.end());
            if(candidate == bomb){
                int bomblen = bomb.length();
                for(int j = 0 ; j < bomblen ; j++)
                    stack.pop_back();
            }
        }
    }
    
    if(stack.empty()){
        cout << "FRULA";
    }else{
        string result(stack.begin(), stack.end());
        cout << result;
    }
    
    return 0;
}

 

그리고 시간초과 떴지만 결과는 나오는 Swift 코드

import Foundation

var str:String = readLine() ?? ""
var bomb:String = readLine() ?? ""

while(true){
    if str.isEmpty {
        print("FRULA")
        break
    }
    let range = str.range(of: bomb)
    if range == nil { break }
    else {
        str.replaceSubrange(range!, with: "")
    }
}

print(str)
728x90