https://www.acmicpc.net/problem/9935
[문제]
상근이는 문자열에 폭발 문자열을 심어 놓았다. 폭발 문자열이 폭발하면 그 문자는 문자열에서 사라지며, 남은 문자열은 합쳐지게 된다.
폭발은 다음과 같은 과정으로 진행된다.
- 문자열이 폭발 문자열을 포함하고 있는 경우에, 모든 폭발 문자열이 폭발하게 된다. 남은 문자열을 순서대로 이어 붙여 새로운 문자열을 만든다.
- 새로 생긴 문자열에 폭발 문자열이 포함되어 있을 수도 있다.
- 폭발은 폭발 문자열이 문자열에 없을 때까지 계속된다.
상근이는 모든 폭발이 끝난 후에 어떤 문자열이 남는지 구해보려고 한다. 남아있는 문자가 없는 경우가 있다. 이때는 "FRULA"를 출력한다. 폭발 문자열은 같은 문자를 두 개 이상 포함하지 않는다.
[입력 조건]
- 첫째 줄에 문자열이 주어진다. 문자열의 길이는 1보다 크거나 같고, 1,000,000보다 작거나 같다.
- 둘째 줄에 폭발 문자열이 주어진다. 길이는 1보다 크거나 같고, 36보다 작거나 같다.
- 두 문자열은 모두 알파벳 소문자와 대문자, 숫자 0, 1, ..., 9로만 이루어져 있다.
[코드]
import java.util.*;
public class BaekJoon_9935 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
String str=sc.next();
String boom=sc.next();
Stack<Character> stack=new Stack<>();
for(int i=0;i<str.length();i++) {
stack.add(str.charAt(i));
// 스택에 쌓인 문자의 갯수가 폭발 문자열의 길이와 같거나 클때 폭발 문자열이 있는지 검사
if(stack.size()>=boom.length()) {
boolean flag=true; // 폭발 문자열이 포함되어 있는지 체크하는 변수
// 스택에 있는 문자열과 폭발 문자열을 비교한다.
for(int j=0;j<boom.length();j++) {
if(stack.get(stack.size()-boom.length()+j)!=boom.charAt(j)) {
flag=false;
break;
}
}
if(flag) { // 폭발 문자열이 있다면 그 길이만큼 스택에서 제거해주기
for(int j=0;j<boom.length();j++)
stack.pop();
}
}
}
StringBuilder sb=new StringBuilder();
for(char ch:stack)
sb.append(ch);
System.out.println(sb.length()>0?sb:"FRULA");
}
}
[고찰]
이번 문제의 핵심은 자료구조 스택을 사용해야 한다는 점이었다. 스택에 문자열을 삽입하면서 폭발 문자열의 길이만큼 문자가 쌓이면 스택에 쌓인 문자와 폭발 문자열을 비교하면서 폭발 문자열이 포함되어 있는지 확인하는 방식으로 해결할 수 있었다. 스택을 사용한다는 점만 파악했다면 쉽게 해결할 수 있는 문제였다.
'백준' 카테고리의 다른 글
[백준_2470번] 두 용액 (0) | 2021.12.10 |
---|---|
[백준_4179번] 불! (0) | 2021.12.10 |
[백준_2580번] 스도쿠 (0) | 2021.12.01 |
[백준_16946번] 벽 부수고 이동하기4 (0) | 2021.12.01 |
[백준_11659번] 구간 합 구하기 4 (0) | 2021.11.29 |