알고리즘/백준
[백준 9935번 문자열 폭발]
익명의 문과 개발자
2024. 9. 5. 22:59
728x90
728x90
오늘의 문제는 "문자열 폭발"이다.
#고민의 흐름
처음엔 무조건 완전탐색!
처음엔 코드를 어떻게 짜야하나 고민하다가 큐를 두 개 만들어서
큐 1 > 큐2, 큐2 > 큐1 번갈아 가며 폭발 문자열을 제거해 나가는 방식을 채택했다.
하지만 결과는 메모리 초과 ,, 100만이나 되는 길이의 문자열을 하나하나 다 넣어주니
어떻게 보면 당연한 결과였던 것 같다.
한참을 고민하다가 아래의 분류(힌트)를 보았다...
안 보고 충분한 시간을 고민해 보는 연습도 해야 하는데.. ㅠ
그 결과 자료구조의 스택!으로 분류되어 있음을 알게 되었다.
하지만 스택임을 알고 나서도 잠시 고민을 하게 되었다.
어... 스택? 왜..?
그래도 결국 방법을 찾은 거 같아 그대로 문제를 풀이하니 맞았다.
자세한 내용은 코드와 함께 보자!
코드는 다음과 같다.
( 코드가 너무 커 보인다면 "Ctrl + 스크롤 내리기" 하면 잘 보여요! )
( 초기화는 "Ctrl + 0" / 다시 확대는 "Ctrl + 스크롤 올리기" )
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 str = br.readLine();
String boom = br.readLine();
Stack<Character> s = new Stack<>(); // 스택과 입력 받아주기 !
for(int i = 0; i<str.length(); i++){ // 기본 str의 길이만큼 돌면서 ~
char c = str.charAt(i); // 이번 문자
if(c != boom.charAt(boom.length()-1)){ // 폭탄문자열의 마지막이랑 다르다면?
s.add(c); // 스택에 넣어준다.
}else{ // 마지막과 같다면?
if(s.size() + 1 < boom.length()){
// 하지만 같더라도 이미 스택안의 내용합쳐도 길이가 부족하다면
// 곱게스택에 마저 넣어놓고 이어서 진행한다.
s.add(c);
continue;
}
// 충분히 검사해볼만한 크기라면?!
String temp = String.valueOf(c);
for(int j = 0; j<boom.length()-1; j++){
temp = String.valueOf(s.pop()) + temp;
}
//폭파 문자열과 같은 길이만큼 꺼내며 문자열을 만들고
//만들어진 문자열이 폭파 문자열과 같은지 확인하고!
if(!temp.equals(boom)){ // 다르다면 다시 그대로 스택에 넣기
for(int j = 0; j<temp.length(); j++){
s.add(temp.charAt(j));
}
}
//같다면 내비두고 진행하기 !
//temp의 초기화는 매번 해주니까 신경안써도되고
//내비두고 진행하면 자연스레 그만큼 빠진다 !
}
}
if(s.size() == 0){ // 다하고 보니 스택이 비었다면?
System.out.print("FRULA"); // 해당하는 문자열 출력하고 끝내기 !
return;
}
StringBuilder sb = new StringBuilder();
while(!s.isEmpty()){ // 스택에 남은게 있다면? 싹다 sb에 넣어주고
sb.append(s.pop());
}
System.out.print(sb.reverse()); // 출력하기전에 뒤집는거 잊지말기 !
}
}
요즘 시간에 쫓겨 하루 한 문제를 풀다가도 고민하는 시간이 점점 줄어가고 있다.
아침시간을 좀 더 잘 활용할 수 있도록 일찍 일어나야 하는데 ,, 쉽지가 않다..자기소개서도 작성해야 하고 사이드 프로젝트도 해야 하는데 ,, 파이팅 해야겠다..

궁금한 점이 있거나 보충할 점이 있다면 언제든 댓글 부탁드립니다 ~
https://www.acmicpc.net/problem/9935
728x90