어제의 나보다 성장한 오늘의 나

[백준][BOJ-9935][자바] 문자열 폭발 본문

알고리즘/백준(BOJ)

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

NineOne 2021. 4. 6. 21:07

www.acmicpc.net/problem/9935

 

9935번: 문자열 폭발

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

www.acmicpc.net

import java.io.*;
import java.util.*;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String str = br.readLine();
		String boom = br.readLine();
		
		boolean flag = false;
		char[] result = new char[str.length()];
		int index =0;
		
		for(int i=0; i<str.length(); i++) {
			result[index++] = str.charAt(i);
			
			if(index >= boom.length()) {
				
				flag = false;
				for(int j=0; j<boom.length(); j++) {
					if(boom.charAt(j) != result[index - boom.length() +j]) flag = true;
				}
				
				if(!flag) {
					index -= boom.length();
				}
			}
		}
		
		StringBuilder sb = new StringBuilder();
		for(int i=0; i<index; i++) {
			sb.append(result[i]);
		}
		
		if(index ==0) System.out.println("FRULA");
		else System.out.println(sb.toString());
	}
}

정리

먼저 contains와 replace를 생각하게 되었는데 메모리 초과가 떴다. 그래서 다른 방식으로 접근하였다.

  • 결괏값을 저장하는 char배열 선언
  • result배열에 문자열을 하나씩 저장한다.
  • index(result에 들어있는 문자 수)의 값이 폭발 문자열의 길이와 같거나 크면 result배열 끝쪽(폭발 문자열 길이만큼)과 폭발 문자열을 비교한다.
  • 정확히 일치하면 index를 폭발 문자열 길이만큼 빼주고 문자열 길이만큼 반복문을 진행한다.
  • 마지막으로 남을 문자열을 구할때 result [i]을 String에 계속 더해 줄 건데 이때 String += result [i]을 해주면 메모리 초과가 100프로 난다. 무조건 StringBuilder를 사용해야 된다 ( 20분 동안 헤매었다 )

 

Comments