[Baekjoon] 9935번: 문자열 폭발

2023. 3. 17. 23:42Computer Sciences/Problem Solve

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

 

9935번: 문자열 폭발

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

www.acmicpc.net

문제 설명

먼저 문자열 한 줄이 주어진다. 그 다음 폭발 키워드 문자열이 주어진다. 만약 문자열에 폭발 키워드 문자열이 있으면 해당 문자열이 폭발하고 앞 뒤 문자열은 합쳐진다. 이때 폭발이 모두 끝난 후 남은 문자열을 출력하면 된다. 만약 남은 문자열이 없는 경우, 즉 모든 문자열이 폭발한 경우 FRULA를 출력한다.

스택이나 StringBuilder를 활용하면 효율적으로 해결할 수 있다.

풀이 방법 1. StringBuilder

import java.io.*;

class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        String str = br.readLine();
        String bomb = br.readLine();
        
        StringBuilder sb = new StringBuilder();
        
        for (int i = 0; i < str.length(); i++) {
            char cur = str.charAt(i);
            sb.append(cur);
            
            if (sb.length() >= bomb.length()) {
                boolean isExplode = true;
                for (int j = 0; j < bomb.length(); j++) {
                    char ch1 = sb.charAt(sb.length() - bomb.length() + j);
                    char ch2 = bomb.charAt(j);
                    
                    if (ch1 != ch2) {
                        isExplode = false;
                        break;
                    }
                }
                
                if (isExplode) {
                    sb.delete(sb.length() - bomb.length(), sb.length());
                }
            }
        }
        
        System.out.print(sb.length() == 0 ? "FRULA" : sb);
    }
}

풀이 방법 2. Stack

import java.io.*;
import java.util.Stack;

class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        String str = br.readLine();
        String bomb = br.readLine();
        
        Stack<Character> s = new Stack<>();
        
        for (int i = 0; i < str.length(); i++) {
            char cur = str.charAt(i);
            s.push(cur);
            
            if (s.size() >= bomb.length()) {
                boolean isExplode = true;
                for (int j = 0; j < bomb.length(); j++) {
                    char ch1 = s.get(s.size() - bomb.length() + j);
                    char ch2 = bomb.charAt(j);
                    
                    if (ch1 != ch2) {
                        isExplode = false;
                        break;
                    }
                }
                
                if (isExplode) {
                    for (int j = 0; j < bomb.length(); j++) s.pop();
                }
            }
        }
        
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.size(); i++) sb.append(s.get(i));
        
        System.out.print(sb.length() == 0 ? "FRULA" : sb);
    }
}

성능은 StringBuilder가 더 좋았다.