[Java] 백준 9935번 [문자열 폭발] 자바

: ) YOUNG·2022년 4월 18일
2

알고리즘

목록 보기
104/370
post-thumbnail

백준 9935번
https://www.acmicpc.net/problem/9935


문제

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

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

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

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

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


입력

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

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

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


출력

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


예제 입력

mirkovC4nizCC44
C4

12ab112ab2ab
12ab

예제 출력

mirkovniz

FRULA

생각하기

처음에 문자열을 하나씩 순회하면서 폭발 문자열을 모두 제거하는 방식을 선택했는데, 시간 초과가 문제였다.

시간 초과가 문제여서 해결하기 위해 많은 노력을 했지만,, 결국 실패해서 다른 분들의 코드를 참고하여서 풀었다.

이 문제는 stack을 사용해서 풀어야 한다.

동작

		String str = br.readLine();
		String bomb = br.readLine();
		int str_len = str.length();
		int bomb_len = bomb.length();

시간 초과가 문제일 때는 항상 사용하는 방법인데, 길이 계산은 미리 변수로 만들어 두고 한다. 최대한 시간을 아낄 수 있다.

	Stack<Character> stack = new Stack<>();

		for(int i=0; i<str_len; i++) {
			int count = 0;
			stack.push(str.charAt(i));

			// 스택의 크기가 폭탄 문자열의 길이와 같아지면 탐색 시작
			if(stack.size() >= bomb_len) {

				for(int j=0; j<bomb_len; j++) {

					if(stack.get(stack.size() - bomb_len + j) == bomb.charAt(j)) {
						count++;
					}	

					if(count == bomb_len) {
						for(int k=0; k<bomb_len; k++) {
							stack.pop();
						}
					}

				}
			}
		}

스택의 자료구조를 사용해서 bomb의 길이보다 스택의 크기가 커졌을 경우, 반복하며 스택에 있는 데이터를 검사해서 bomb문자열과 같을 경우, stack.pop을 실행한다.




코드

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

public class Main {	

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();

		String str = br.readLine();
		String bomb = br.readLine();
		int str_len = str.length();
		int bomb_len = bomb.length();

		Stack<Character> stack = new Stack<>();

		for(int i=0; i<str_len; i++) {
			int count = 0;
			stack.push(str.charAt(i));

			// 스택의 크기가 폭탄 문자열의 길이와 같아지면 탐색 시작
			if(stack.size() >= bomb_len) {

				for(int j=0; j<bomb_len; j++) {

					if(stack.get(stack.size() - bomb_len + j) == bomb.charAt(j)) {
						count++;
					}	

					if(count == bomb_len) {
						for(int k=0; k<bomb_len; k++) {
							stack.pop();
						}
					}

				}
			}
		}

		if(stack.isEmpty()) {
			System.out.println("FRULA");
		}
		else {
			for(char ch : stack) {
				sb.append(ch);
			}
		}

		System.out.println(sb);
		
	} // End of main
} // End of class

0개의 댓글