πŸ“– [λ°±μ€€μ•Œκ³ λ¦¬μ¦˜ 풀이] Q.9935 λ¬Έμžμ—΄ 폭발 문제 풀이 - java

πŸ“– 문제

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

μƒκ·Όμ΄λŠ” λ¬Έμžμ—΄μ— 폭발 λ¬Έμžμ—΄μ„ 심어 λ†“μ•˜λ‹€. 폭발 λ¬Έμžμ—΄μ΄ ν­λ°œν•˜λ©΄ κ·Έ λ¬ΈμžλŠ” λ¬Έμžμ—΄μ—μ„œ 사라지며, 남은 λ¬Έμžμ—΄μ€ ν•©μ³μ§€κ²Œ λœλ‹€.

ν­λ°œμ€ λ‹€μŒκ³Ό 같은 κ³Όμ •μœΌλ‘œ μ§„ν–‰λœλ‹€.

- λ¬Έμžμ—΄μ΄ 폭발 λ¬Έμžμ—΄μ„ ν¬ν•¨ν•˜κ³  μžˆλŠ” κ²½μš°μ—, λͺ¨λ“  폭발 λ¬Έμžμ—΄μ΄ ν­λ°œν•˜κ²Œ λœλ‹€. 남은 λ¬Έμžμ—΄μ„ μˆœμ„œλŒ€λ‘œ 이어 λΆ™μ—¬
  μƒˆλ‘œμš΄ λ¬Έμžμ—΄μ„ λ§Œλ“ λ‹€.
- μƒˆλ‘œ 생긴 λ¬Έμžμ—΄μ— 폭발 λ¬Έμžμ—΄μ΄ ν¬ν•¨λ˜μ–΄ μžˆμ„ μˆ˜λ„ μžˆλ‹€.
- ν­λ°œμ€ 폭발 λ¬Έμžμ—΄μ΄ λ¬Έμžμ—΄μ— 없을 λ•ŒκΉŒμ§€ κ³„μ†λœλ‹€.

μƒκ·Όμ΄λŠ” λͺ¨λ“  폭발이 λλ‚œ 후에 μ–΄λ–€ λ¬Έμžμ—΄μ΄ λ‚¨λŠ”μ§€ ꡬ해보렀고 ν•œλ‹€. λ‚¨μ•„μžˆλŠ” λ¬Έμžκ°€ μ—†λŠ” κ²½μš°κ°€ μžˆλ‹€. μ΄λ•ŒλŠ” β€œFRULA”λ₯Ό 좜λ ₯ν•œλ‹€.

폭발 λ¬Έμžμ—΄μ€ 같은 문자λ₯Ό 두 개 이상 ν¬ν•¨ν•˜μ§€ μ•ŠλŠ”λ‹€.

μž…λ ₯

첫째 쀄에 λ¬Έμžμ—΄μ΄ 주어진닀. λ¬Έμžμ—΄μ˜ κΈΈμ΄λŠ” 1보닀 ν¬κ±°λ‚˜ κ°™κ³ , 1,000,000보닀 μž‘κ±°λ‚˜ κ°™λ‹€.

λ‘˜μ§Έ 쀄에 폭발 λ¬Έμžμ—΄μ΄ 주어진닀. κΈΈμ΄λŠ” 1보닀 ν¬κ±°λ‚˜ κ°™κ³ , 36보닀 μž‘κ±°λ‚˜ κ°™λ‹€.

두 λ¬Έμžμ—΄μ€ λͺ¨λ‘ μ•ŒνŒŒλ²³ μ†Œλ¬Έμžμ™€ λŒ€λ¬Έμž, 숫자 0, 1, …, 9둜만 이루어져 μžˆλ‹€.

좜λ ₯

첫째 쀄에 λͺ¨λ“  폭발이 λλ‚œ ν›„ 남은 λ¬Έμžμ—΄μ„ 좜λ ₯ν•œλ‹€.

πŸ” 접근법

λ¬Έμžμ—΄ 폭발 λ¬Έμ œμž…λ‹ˆλ‹€.

ν…ŒνŠΈλ¦¬μŠ€λ₯Ό μ—°μƒμ‹œν‚€λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

비ꡐ λŒ€μƒμΈ λ¬Έμžμ—΄μ— ν­νŒŒλ˜λŠ” λ¬Έμžμ—΄μ΄ 있으면

ν•΄λ‹Ή ν­νŒŒλ˜λŠ” λ¬Έμžμ—΄μ΄ μ‚¬λΌμ§€λŠ”λ° ν­νŒŒλ˜λŠ” λ¬Έμžμ—΄μ΄ 사라지고 λ‚˜μ„œ

λ‹€μ‹œ ν­νŒŒλ˜λŠ” λ¬Έμžμ—΄μ΄ λ§Œλ“€μ–΄μ§ˆ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. ν•΄λ‹Ή κ²½μš°μ—λ„

폭파λ₯Ό μ‹œν‚€λ©° λ°˜λ³΅ν•©λ‹ˆλ‹€.

μŠ€νƒμ„ μ΄μš©ν•˜μ—¬ 풀이할 수 μžˆμŠ΅λ‹ˆλ‹€.

μŠ€νƒμ„ μ΄μš©ν•΄ 비ꡐ λ¬Έμžμ—΄μ˜ 문자λ₯Ό ν•˜λ‚˜ν•˜λ‚˜ μŒ“μŠ΅λ‹ˆλ‹€.

κ·ΈλŸ¬λ‹€ μƒˆλ‘œ μŒ“μ€ λ¬Έμžκ°€ 폭탄 λ¬Έμžμ—΄μ˜ λ§ˆμ§€λ§‰ λ¬Έμžμ™€ κ°™λ‹€λ©΄

μ΄λŠ” 폭탄 λ¬Έμžμ—΄μ˜ κ°€λŠ₯성이 μžˆμœΌλ―€λ‘œ

폭탄 λ¬Έμžμ—΄λ§ŒνΌ pop으둜 κΊΌλ‚΄μ„œ tempStack 에 μŒ“μ•„μ€λ‹ˆλ‹€.

단 폭탄 λ¬Έμžμ—΄κ³Ό λΉ„κ΅ν•˜λ©° μŒ“μ•„μ€λ‹ˆλ‹€.

폭탄 λ¬Έμžμ—΄μ— 해당이 λœλ‹€λ©΄ κ·ΈλŒ€λ‘œ ν­νŒŒμ‹œμΌœ μ‚­μ œμ‹œν‚€κ³ 

폭탄 λ¬Έμžμ—΄μ— ν•΄λ‹Ή λ˜μ§€ μ•ŠλŠ”λ‹€λ©΄ tempStack에 μžˆλŠ” 것을

λ‹€μ‹œ stack에 μŒ“μ•„μ€λ‹ˆλ‹€.

이런 과정을 톡해 닡을 ꡬ할 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ’» μ½”λ“œ

package problem.stack;

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

public class Main_9935 {
    static String s;
    static String bombString;
    static Stack<Character> stack;
    static Stack<Character> tempStack;
    static StringBuilder sb;
    static BufferedWriter bw;
    public static void main(String[] args) throws IOException {
        bw = new BufferedWriter(new OutputStreamWriter(System.out));
        input();
        solve();
        bw.flush();
        bw.close();
    }

    static void input() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        s = br.readLine();
        bombString = br.readLine();
        br.close();
    }

    static void solve() throws IOException {
        int lastIndex = bombString.length()-1;
        stack = new Stack<>();
        for(int i=0; i<s.length(); i++){
            char currentChar = s.charAt(i);
            stack.push(currentChar);
            if(currentChar == bombString.charAt(lastIndex) && stack.size() >= bombString.length()) {
                tempStack = new Stack<>();
                for (int j = 0; j < bombString.length(); j++) {
                    char temp = stack.pop();
                    if (temp != bombString.charAt(bombString.length() - 1 - j)) {
                        stack.push(temp);
                        while (!tempStack.isEmpty()){
                            stack.push(tempStack.pop());
                        }
                        break;
                    }
                    tempStack.push(temp);
                }
            }
        }
        sb = new StringBuilder();
        while (!stack.isEmpty()){
            sb.append(stack.pop());
        }
        if(sb.length()==0){
            bw.write("FRULA");
        }
        bw.write(sb.reverse().toString());
    }

}

Written on February 17, 2021