빰_s

(22.08.08) (Baekjoon) 9935. 문자열 폭발 본문

알고리즘/문제

(22.08.08) (Baekjoon) 9935. 문자열 폭발

Job_E 2022. 8. 9. 00:48
 

9935번: 문자열 폭발

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

www.acmicpc.net

시간 제한 : 2초(추가시간  X)

메모리 제한 : 128MB

문제

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

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

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

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

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

입력

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

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

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

출력

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

예제 입력 1 복사

mirkovC4nizCC44
C4

예제 출력 1 복사

mirkovniz

예제 입력 2 복사

12ab112ab2ab
12ab

예제 출력 2 복사

FRULA

 

스택을 사용해야 하는 재밌는 문제다.

1변 예시의 문장으로 예시를 들어보자.

 

mirkovC4nizCC44

mirkovnizCC44

mirkovnizC4

mirkovniz

 

다음과 같은 순서로 문자열 폭발이 이뤄진다.

단순하게 생각해도 풀리는 문제다.

"한 단어(a,b,c, ...)씩 스택에 넣어보자"라는 발상만 있으면 풀린다.

mirkovC4( + nizCC44)

스택의 꼭대기에 "C, 4"라는 문자가 각각 존재하면 위 문자를 빼주는 식으로 해결할 수 있다!

간략하게 그림으로 보면 다음과 같다.

 

대상 문자열과 폭발 문자열이 있다고 가정할 때,

대상 문자열로 for문을 돌려 stack에 문자를 쌓아가다가 스택의 꼭대기에 폭발 문자열들이 순서대로 쌓였으면 터트리는 과정을 for 문이 끝날 때까지 반복한다.

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Stack;

public class Main {
	static StringBuilder sb = new StringBuilder();
	static Stack<String> s = new Stack<String>();
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String str = br.readLine();
		String bomb = br.readLine();
		String[] sbss = str.split("");
		for (int i = 0; i < sbss.length; i++) {
			s.push(sbss[i]);
			if(s.size() >= bomb.length()) {
				int cnt = 0;
				for (int j = bomb.length(); j >= 1; j--) {
					if(s.get(s.size()-j).equals(bomb.substring(bomb.length()-j, bomb.length()-j+1))) cnt++;
					else {
						cnt = 0;
						break;
					}
				}
				if(cnt == bomb.length()) {
					while(cnt > 0) {
						s.pop();
						cnt--;
					}
				}
			}
		}
		if(s.isEmpty()) {
			System.out.println("FRULA");
		}
		else {
			while(!s.isEmpty()) {
				sb.append(s.pop());
			}
		}
		sb.reverse();
		System.out.println(sb.toString());
	}
}

Stack에 내용이 없으면 FRULA를 출력하게 하는 걸 잊지 말자.

Comments