본문 바로가기

ALGORITHM

백준 9935 문자열 폭발 (Java)

1. 문제 링크

 

9935번: 문자열 폭발

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

www.acmicpc.net

 

2. 문제 및 입출력예제

 

3. 문제 풀이

1. 입력받은 문자열을 스택에 넣으면서 진행한다.

2. 지금 들어오는 문자가 폭발 문자열의 마지막 글자와 같은 경우 확인한다.

3. 폭발 문자열 길이만큼 확인하면서 뽑아서 temp라는 다른 스택에 넣어둔다.

    3-1. 전부 폭발 문자열이면 그 상태로 다음 문자로 넘어간다.

    3-2. 폭발 문자열이 아닌 문자가 나오면 temp에 넣어둔 문자를 다시 스택에 넣는다.

4. 전부 끝나면 stack에 있는 문자열을 뽑아서 거꾸로 저장해두고, 길이가 0인 경우에만 "FRULA"를 출력한다.

 

4. 코드

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

public class Main {
	static String str, bomb;
	static int blen;
	static Stack<Character> stack;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		str = br.readLine();
		bomb = br.readLine();
		blen = bomb.length();
		char last = bomb.charAt(blen-1);
		
		stack = new Stack<>();
		for(int i=0;i<str.length();i++) {
			char now = str.charAt(i);
			if(now != last) {
				stack.add(now);
			}
			else {
				stack.add(now);
				if(i>=blen-1) { //이 경우에만 앞에 나머지 문자열이 있을 수 있음
					Stack<Character> temp = new Stack<>();
					for(int j=0;j<blen;j++) {
						if(stack.peek() != bomb.charAt(blen-1-j)) { //다르면 다시 넣어야 한다..
							while(!temp.isEmpty()) {
								stack.add(temp.pop());
							}
						}
						else {
							temp.add(stack.pop());
						}
					}
				}
			}			
		}

		StringBuilder sb = new StringBuilder();
		while(!stack.isEmpty()) {
			sb.append(stack.pop());
		}
		StringBuffer buffer = new StringBuffer(sb);
		String result = buffer.reverse().toString();
		
		if(result.length()==0) {
			System.out.println("FRULA");
		}
		else {
			System.out.println(result);
		}
	}
}

 

'ALGORITHM' 카테고리의 다른 글

백준 2529 부등호 (Java)  (0) 2023.06.02
백준 22251 빌런 호석 (Java)  (0) 2023.06.01
백준 16463 13일의 금요일 (Java)  (0) 2023.05.30
백준 1926 그림 (Java)  (1) 2023.05.29
백준 13164 행복 유치원 (Java)  (0) 2023.05.28