자바/알고리즘 문제 풀이

★백준/9935 문자열 폭발/ 스택,리스트

backend dev 2022. 12. 26.

문자열 폭발 다국어

한국어   
시간 제한메모리 제한제출정답맞힌 사람정답 비율
2 초 (추가 시간 없음) 128 MB 50912 12488 8741 24.596%

문제

상근이는 문자열에 폭발 문자열을 심어 놓았다. 폭발 문자열이 폭발하면 그 문자는 문자열에서 사라지며, 남은 문자열은 합쳐지게 된다.

폭발은 다음과 같은 과정으로 진행된다.

  • 문자열이 폭발 문자열을 포함하고 있는 경우에, 모든 폭발 문자열이 폭발하게 된다. 남은 문자열을 순서대로 이어 붙여 새로운 문자열을 만든다.
  • 새로 생긴 문자열에 폭발 문자열이 포함되어 있을 수도 있다.
  • 폭발은 폭발 문자열이 문자열에 없을 때까지 계속된다.

상근이는 모든 폭발이 끝난 후에 어떤 문자열이 남는지 구해보려고 한다. 남아있는 문자가 없는 경우가 있다. 이때는 "FRULA"를 출력한다.

폭발 문자열은 같은 문자를 두 개 이상 포함하지 않는다.

입력

첫째 줄에 문자열이 주어진다. 문자열의 길이는 1보다 크거나 같고, 1,000,000보다 작거나 같다.

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

두 문자열은 모두 알파벳 소문자와 대문자, 숫자 0, 1, ..., 9로만 이루어져 있다.

출력

첫째 줄에 모든 폭발이 끝난 후 남은 문자열을 출력한다.

예제 입력 1 복사

mirkovC4nizCC44
C4

예제 출력 1 복사

mirkovniz

예제 입력 2 복사

12ab112ab2ab
12ab

예제 출력 2 복사

FRULA

 풀이

맨앞에서부터 한글자씩 넣으면서 최대길이가 폭발문자열 이상일경우 폭발문자열이 있는지 체크하고 있으면 삭제해준다. 그걸 모든문자를 다 넣을때까지 반복 

 

 리스트를 이용한 풀이 -> 맨뒤에 삭제는 O(1)이라서 가능한것같다.

import java.io.*;
import java.util.ArrayList;
import java.util.List;


public class Main {

    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));


    /*
       문자열에서 특정 문자열을 찾아 지우고 다시합친다, 를 반복
       완전탐색은 시간초과가 날것이다.
       큐를 이용해서 ? -> 인덱스를 이용할수없으니 앞에서 뒤로 계속 값을 옮겨야함.
       스택을 이용해서? -> 인덱스를 이용해서 쉽게 비교가능.
       리스트를 이용해서? -> 인덱스때문에 스택을 사용한다면 리스트는? -> Array 리스트의 특정인덱스 삽입, 삭제는 O(n)이지만 맨뒤에 삽입삭제는 O(1)?
       최대 100만 문자열 반복문 * 최대 36길이 폭발문자열 -> 시간초과 x?
     */
    static List<Character> list = new ArrayList<>();
    static char[] input;
    static char[] boom;
    static int boomLength;

    public static void main(String[] args) throws IOException {

        input();
        solve();

        bw.flush();
        bw.close();

    }

    static void input() throws IOException {
        input = br.readLine().toCharArray();
        boom = br.readLine().toCharArray();
        boomLength = boom.length;
    }

    static void solve() throws IOException {

        for (int i = 0; i < input.length; i++) {
            list.add(input[i]);
            if (list.size() >= boomLength) {
                boolean check = true;
                for (int j = 0; j < boomLength; j++) {
                    if (list.get(list.size() - boomLength+j) != boom[j]) {
                        check = false;
                        break;
                    }
                }
                if (check) {
                    for (int k = 0; k < boomLength; k++) {
                        list.remove(list.size() - 1);
                    }
                }
            }
        }

        if (list.isEmpty()) {
            bw.write("FRULA");
        } else {
            for (char a : list) {
                bw.write(a+"");
            }
        }

    }
    
}

스택으로 풀이

리스트를 스택으로 수정

public class Main {

    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));


    /*
     */
    static Stack<Character> stack = new Stack<>();
    static char[] input;
    static char[] boom;
    static int boomLength;

    public static void main(String[] args) throws IOException {

        input();
        solve();

        bw.flush();
        bw.close();

    }

    static void input() throws IOException {
        input = br.readLine().toCharArray();
        boom = br.readLine().toCharArray();
        boomLength = boom.length;
    }

    static void solve() throws IOException {

        for (int i = 0; i < input.length; i++) {
            stack.add(input[i]);
            if (stack.size() >= boomLength) {
                boolean check = true;
                for (int j = 0; j < boomLength; j++) {
                    if (stack.get(stack.size() - boomLength+j) != boom[j]) {
                        check = false;
                        break;
                    }
                }
                if (check) {
                    for (int k = 0; k < boomLength; k++) {
                        stack.pop();
                    }
                }
            }
        }

        if (stack.isEmpty()) {
            bw.write("FRULA");
        } else {
            for (char a : stack) {
                bw.write(a+"");
            }
        }

    }

}

https://loosie.tistory.com/317

 

[BOJ] 백준 9935번 문자열 폭발 (Java)

#9935 문자열 폭발 난이도 : 골드 4 유형 : 자료구조 / 문자열 / 스택 9935번: 문자열 폭발 첫째 줄에 문자열이 주어진다. 문자열의 길이는 1보다 크거나 같고, 1,000,000보다 작거나 같다. 둘째 줄에 폭

loosie.tistory.com

 

댓글