replace, replaceFirst를 쓰면 메모리초과, 시간초과가 발생하기에 다른 방법으로 접근을 해야한다. substring을 너무 반복적으로 쓰기 싫어서 문자열을 split 해서 배열에 담았다.
반복문을 돌면서 우선 StringBuilder에 문자를 추가한뒤에 비교해야하는 문자열(t)와 비교하여 길이가 아직 작다면 continue, 길이가 같아지거나 큰 경우에는 (StringBuilder의 길이 - 문자열 t의 길이 (최솟값 0), StringBuilder의 길이) 의 substring을 구한다. 이렇게 될경우 t와 같은 길이의 부분 문자열이 나오기 때문이다. substring과 t의 길이가 같다면 문자열 폭발이므로 sb에서 해당 substring 부분을 지운다.
sb의 길이가 0이라면 모든 문자열이 폭발했다는 뜻이므로 "FRULA"를 아닌경우에는 StringBuilder를 출력한다.
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String[] s = sc.next().split("");
String t = sc.next();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < s.length; i++) {
sb.append(s[i]);
// System.out.println(sb);
if (sb.length() >= t.length()) {
if (sb.substring(sb.length()-t.length(), sb.length()).equals(t)) {
sb.delete(sb.length()-t.length(), sb.length());
// System.out.println(sb);
}
} else {
continue;
}
}
System.out.println(sb.length() ==0 ? "FRULA" : sb);
}
}