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

java

문제 분석

  • 문자열이 두 개 주어진다.
  • 첫번째 문자열에서, 두번째 문자열을 지우고 새로운 문자열을 만듬.
  • 첫 번째 문자열에 두 번째 문자열이 포함되는 한 반복하고, 결과를 출력할 것.

입력조건

문자열 1
문자열 2

풀이과정

  • 그냥 replaceAll을 이용해서 문자열을 정리하다보니, 메모리초과가 발생하였다.
  • String을 자르고 다시 붙이는 과정에서, 이런 일이 발생한다고 생각해서, String을 char단위로 쪼개서 연산하기로 하였다.
  • 입력받은 문자열을 스택에 한자리씩 넣으면서, 지금 문자가 문자열2의 끝자리와 일치하는지 확인한다.
  • 끝자리가 일치하면, 한 자리씩 앞으로 가며 문자열이 같은지 확인하고, 전부 같다면 그 길이만큼의 문자열을 스택에서 지운다.
    • 이렇게 하면, 지운 후 새로 생긴 문자열에서 문자열2가 생성되는 것을 한번에 발견할 수 있다.
  • 이후에 스택에서 문자열을 꺼내고, 역순으로 출력한다.

전체 코드

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

public class BJ9935_물자열폭발 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		char[] ini = br.readLine().toCharArray();
		char[] ref = br.readLine().toCharArray();
		Stack<Character> stk = new Stack<>();
		
		int ilen = ini.length;
		int reflen = ref.length;
		for(int i = 0; i < ilen; i++) {
			stk.add(ini[i]);
			
//			System.out.println("사이클 시작 : " + stk.toString());
			
			if(ini[i] == ref[reflen-1]) {
				Stack<Character> tmpstk = new Stack<>();
				int loc = reflen;
				
				char a;
				do {
					loc--;
					if(loc >= 0 && stk.size() > 0) {
						a = stk.pop();
						tmpstk.add(a);						
					}
					else break;
					
				} while(loc >= 0 && a == ref[loc]);
				
				
				// 여기 오면 통과
				if(loc < 0) {
//					System.out.println("성공");
					continue;
				}
				// 여기 오면 실패
				else {
//					System.out.println("실패");
					while(!tmpstk.isEmpty())
						stk.add(tmpstk.pop());
				}
			}
//			System.out.println("사이클 끝 : " + stk.toString());
		}
		// 연산 끝.
		
		if(stk.isEmpty()) System.out.print("FRULA");
		else {
			StringBuilder sb = new StringBuilder();
			while(!stk.isEmpty()) sb.append(stk.pop());
			System.out.print(sb.reverse());
		}
	}
}

PS

당연히 통과 실패한 꼼수 코드…

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

public class BJ9935_물자열폭발 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String ini = br.readLine();
		String ref = br.readLine();
		
		int lena, lenb = 0;
		do {
			lena = ini.length();
			
			ini = ini.replaceAll(ref, "");
            
			lenb = ini.length();
		} while(lena != lenb);
		
		if(ini.equals("")) System.out.print("FRULA");
		else	System.out.println(ini);
	}
}