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

DAUN JO·2021년 8월 27일
0

BOJ

목록 보기
11/35
post-thumbnail

BOJ 9935 G4 문자열폭발

  • 문자열
  • gold4



🔍 문제 설명

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

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

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

문자열이 폭발 문자열을 포함하고 있는 경우에, 모든 폭발 문자열이 폭발하게 된다. 남은 문자열을 순서대로 이어 붙여 새로운 문자열을 만든다.
새로 생긴 문자열에 폭발 문자열이 포함되어 있을 수도 있다.
폭발은 폭발 문자열이 문자열에 없을 때까지 계속된다.
상근이는 모든 폭발이 끝난 후에 어떤 문자열이 남는지 구해보려고 한다. 남아있는 문자가 없는 경우가 있다. 이때는 "FRULA"를 출력한다.

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


✔ 입력

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

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

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

✔ 출력

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


💡 풀이

스택을 이용해서 풀었습니다.

문자열의 길이만큼 for문을 돌면서 문자열 폭발이 이루어지도록 했습니다.
먼저 스택에 문자를 넣고 스택사이즈가 폭발문자열의 길이보다 길 경우 폭발 검사를 합니다.

  1. 인덱스를 폭발문자열길이-1로 두고 폭발문자열에서 해당하는 인덱스의 문자를 find 변수에 담는다.
  2. 스택.peek했을 때 해당 문자(find)가 있으면 pop해서 Stringbuilder에 이어붙인다.
  3. 그리고 인덱스를 하나 감소시키고 다음 문자를 찾는다
  4. 만약 폭발문자열이 아니였으면 다시 StringBuilder의 문자열을 뒤에서부터 다시 stack에 넣는다.



💡 소스코드



public class Main_BJ_9935_문자열폭발3 {
	/*
	폭발과정
	1. 문자열이 폭발 문자열 포함 시 모든 폭발 문자열 폭발 => 남은 문자열 이어붙임
	2. 계속반복
	3. 남은 문자열 업스면  "FRULA"를 출력
	
	
	두번째 시도 -> 조금 개선
	str.length만큼만 for문 돌고, 못찾으면 바로 break하도록
	
	161280	596
	*/
	static String str, bomb;
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		str = br.readLine(); //문자열
		bomb = br.readLine(); //폭발 문자열
		
		Stack<Character> stack = new Stack<>();
		
		
		
		for (int i = 0; i < str.length(); i++) {
			stack.push(str.charAt(i)); //스택에 문자를 넣는다
			
			
			if(stack.size() >= bomb.length()){ //스택사이즈가 폭발문자열의 길이보다 길어지면 검사
				
				boolean flag = false;
				int idx = bomb.length()-1; 
				
				StringBuilder tmp = new StringBuilder();
				
				
				char find = bomb.charAt(bomb.length()-1); //찾을 문자
				
				while(true) {
					if(stack.peek() == find) { //찾으면
						tmp.append(stack.pop()); //스택에서빼서 stringbuilder에 붙인다
						idx-=1; //인덱스 하나 감소
						if(idx >= 0) { 
							find = bomb.charAt(idx); //해당 인덱스에 해당하는 find char 변경
						}else { //폭발문자열 폭발
							flag = true;
							break;
						}
					}else {
						break;
					}
				}
				
				
				if(!flag) { //폭발문자열이 아니었다 -> 다시 집어넣는다
					
					for (int j = tmp.length()-1; j >= 0 ; j--) {
						stack.push(tmp.charAt(j)); // 스택에 다시 집어넣는다. 이때 tmp는 거꾸로되어있으므로 뒤에서부터 집어넣음
					}
				}

			}
		}
		
		if(stack.isEmpty()) System.out.println("FRULA"); //남아있는 문자가 없으면 FRULA 출력
		else {
			StringBuilder ans = new StringBuilder();
			while(!stack.isEmpty()) ans.append(stack.pop());
			
			System.out.println(ans.reverse()); //남은문자열 출력
		}
	}
}



profile
🍕

0개의 댓글