백준

백준[9935]번: 문자열 폭발 ( Java )

하루우울루 2023. 2. 17. 14:25

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

 

9935번: 문자열 폭발

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

www.acmicpc.net


개발환경은 eclipse를 사용했습니다.

 

 

Code

 

정답

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

public class Main
{
	public static void main(String[] args) throws IOException  
	{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		String arr = br.readLine(); //문자열 받기
		String bomb = br.readLine(); // 제거할 문자열 받기
		
		for(int i=0;i<arr.length();i++) 
		{
			char ch = arr.charAt(i); // 문자열에서 문자열 하나씩 뽑기
			sb.append(ch);
			
			if(sb.length() >= bomb.length()) 
			{
				boolean flag = true;
				
				for(int j=0;j<bomb.length();j++) // 제거할 문자열 길이만큼 비교
				{
					char arrch = sb.charAt(sb.length()-bomb.length()+j);
					char bombch = bomb.charAt(j);
				
					if(arrch != bombch) // 다르다면 반복문 탈출
					{
						flag = !flag;
						break;
					}
				}
				if(flag)
				{
					sb.delete(sb.length()-bomb.length(),sb.length()); // 제거
				}
			}
		}
        
		if(sb.length() == 0)
		{
			System.out.print("FRULA");
		}
		else
		{
			System.out.print(sb.toString());
		}
		
	}
}

틀린코드 

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

public class Main
{
	public static void main(String[] args) throws IOException  
	{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String arr = br.readLine();
		
		String ans = br.readLine();
		
		while(arr.contains(ans))
		{
			arr = arr.replace(ans,"");
		}
	
		if(arr.length() == 0)
		{
			System.out.print("FRULA");
		}
		else
		{
			System.out.print(arr);
		}
		
	}
}

처음에 문자열 replace를 사용해서 이렇게 풀었는데 제출했더니 메모리 초과가 났다.

다른 방법이 필요했다.

 

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

public class Main
{
	public static void main(String[] args) throws IOException  
	{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		Deque<String> deque = new LinkedList<>(); 
		
		String arr = br.readLine();
		
		String ans = br.readLine();
		
		deque.offer(arr);
		
		while(deque.contains(ans))
		{
			String temp = deque.remove();
			
			StringTokenizer st = new StringTokenizer(temp,ans);
			
			String result = "";
			
			while(st.hasMoreTokens())
			{
				result+= st.nextToken();
			}
			
			deque.offer(result);
		}
		
		if(deque.isEmpty())
		{
			System.out.print("FRULA");
		}
		else
		{
			System.out.print(deque);
		}
		
	}
}

 


다음으로는 이렇게 풀었었는데 Tokenizer의 ans값이 문자열 그대로 구분지어주는것이 아니라 출력이 이상하게 나왔다.

deque.offer(arr); 

여기가 문제였다.

덱을 사용하는 의미가 없어 다른 방법을 생각하다가 풀지 못했다.

 

계속 문자열로 제거하는 방법만 생각하다가 인터넷을 보고 정답을 알았다.

 

그냥 문자를 하나씩 검사하는 방법이었다.

스스로 해결하지 못해서 문제를 풀었다는 느낌이 들지 않았다.

 

정답코드를 보면 쉽게 다들 쉽게 푸시는것 같은데 나만 못푸는 것 같아서 열심히 좀 해야겠다