Hope Everyone Is Happy

[골드5] 9935. 문자열 폭발 (Java) 본문

※ 백준 (Baekjoon)/[Java] 문제 풀이 ( Solve the problems)

[골드5] 9935. 문자열 폭발 (Java)

J 크 2023. 8. 10. 23:40
728x90
반응형

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

 

9935번: 문자열 폭발

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

www.acmicpc.net

출력속도,, 제가 폭발할뻔한 문제였습니다..  C++그립다


※  문제를 요약하면 아래와 같습니다.

기준 문자열과 폭탄 문자열 두가지 입력

 기준 문자열 내에 폭탄 문자열과 같은 문자열은 제거

   ex ) 기준 문자열 : mirkovC4nizCC44

          폭탄 문자열 : C4

         ====> mirkovC4nizCC44 -> mirkovnizC4 -> mirkovniz

 입력은 첫 줄에 기준 문자열, 둘째 줄에 폭탄 문자열 입력

 출력은 폭탄 문자열을 전부 지운 문자열, 문자열이 비어있을 경우 'FRULA' 출력

◈ Input -1

mirkovC4nizCC44
C4

◈ Output -1

mirkovniz

◈ Input -2

12ab112ab2ab
12ab

◈ Output -2

FRULA

 ◎  아래와 같이 솔루션을 정리하였습니다.

기존 문자열에서 문자를 하나씩 스택 자료형에 추가

▶만약 폭탄 문자열의 마지막 문자와 같은 데이터 발견 시, 해당 인덱스 부터 앞으로 다시 탐색

▶앞으로 다시 탐색하는 과정에서 폭탄 문자열과 일치하면 제거 (stack 자료구조, pop() 활용하여 제거 )

System.out.println() 출력 하면 계속 시간 초과 발생 => BufferedWriter 사용

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

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

		Stack<Character> listResult = new Stack<>();

		String strTemp = bf.readLine();
		String strBomb = bf.readLine();

		for (int i = 0; i < strTemp.length(); i++) {
			listResult.push(strTemp.charAt(i));
			
			if (listResult.size() >= strBomb.length() &&
					listResult.peek() == strBomb.charAt(strBomb.length() - 1)) {
				
				boolean bSearch = true;
				int nIndex = strBomb.length() -1;
				for(int j = listResult.size()-1; j > listResult.size()-1 - strBomb.length() ; j--) {
					if(listResult.get(j) != strBomb.charAt(nIndex)) {
						bSearch = false;
						break;
					}
					nIndex--;
				}
				
				if(bSearch) {
					for(int j = 0 ; j < strBomb.length(); j++)
						listResult.pop();
				}
				
			}
		}

		for (int i = 0; i < listResult.size(); i++)
			bw.write(listResult.get(i));

		if (listResult.isEmpty())
			bw.write("FRULA");
		
		bw.flush();
		bw.close();
	}
}

 System.out.println의 속도가 느린 것을 생각 못하고 코드를 극한까지 줄이다가 설마 하고 바꿔봤는데 바로 정답.. 앞으로는 출력 구문도 신경써서 코드를 작성하겠습니다.

읽어주셔서 감사합니다!

Good Luck! (피드백 고맙습니다)