BOJ 9935 문자열 폭발
https://www.acmicpc.net/problem/9935
문제
상근이는 문자열에 폭발 문자열을 심어 놓았다. 폭발 문자열이 폭발하면 그 문자는 문자열에서 사라지며, 남은 문자열은 합쳐지게 된다.
폭발은 다음과 같은 과정으로 진행된다.
문자열이 폭발 문자열을 포함하고 있는 경우에, 모든 폭발 문자열이 폭발하게 된다. 남은 문자열을 순서대로 이어 붙여 새로운 문자열을 만든다. 새로 생긴 문자열에 폭발 문자열이 포함되어 있을 수도 있다. 폭발은 폭발 문자열이 문자열에 없을 때까지 계속된다. 상근이는 모든 폭발이 끝난 후에 어떤 문자열이 남는지 구해보려고 한다. 남아있는 문자가 없는 경우가 있다. 이때는 “FRULA”를 출력한다.
폭발 문자열은 같은 문자를 두 개 이상 포함하지 않는다.
입력
첫째 줄에 문자열이 주어진다. 문자열의 길이는 1보다 크거나 같고, 1,000,000보다 작거나 같다.
둘째 줄에 폭발 문자열이 주어진다. 길이는 1보다 크거나 같고, 36보다 작거나 같다.
두 문자열은 모두 알파벳 소문자와 대문자, 숫자 0, 1, …, 9로만 이루어져 있다.
출력
첫째 줄에 모든 폭발이 끝난 후 남은 문자열을 출력한다.
예제 입력 1
mirkovC4nizCC44 C4
예제 출력 1
mirkovniz
예제 입력 2
12ab112ab2ab 12ab
예제 출력 2
FRULA
코드
Deque(ArrayQueue)는 Stack과 달리 Vecter로 구현되지 않아서 특정 인덱스의 값을 가져오는 get(int index) 메소드가 없다.
따라서 Deque에서 특정 인덱스 값을 가져오기 위해서는 Deque를 LinkedList로 초기화 한 뒤 List로 형변환해서 List 인터페이스의 get() 메소드를 사용해야 한다.
만약 Deque를 ArrayQueue로 초기화했다면, ArrayQueue가 List 인터페이스를 상속받지 않았기 때문에 List로 형변환 시킬 수 없다.
하지만 순차적으로 조회할 경우, 위와 같이 하지 말고 iterator로 순회하는 것이 더 깔끔하다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String sentence = br.readLine(), bomb = br.readLine();
// 폭발 문자열이 검사 대상 문자열보다 길 때, 검사 문자열 출력 후 종료
if(sentence.length() < bomb.length()) {
System.out.println(sentence);
return;
}
Deque<Character> deque = new LinkedList<>();
for (int i = 0; i < sentence.length(); i++) {
// 현재 검사하고 있는 문자를 deque에 push한다.
deque.push(sentence.charAt(i));
// deque에 있는 문자의 수가 폭발 문자열의 길이보다 작을 경우, 검사 생략
if (deque.size() < bomb.length()) continue;
// 가장 최근에 push한 문자부터 폭발 문자열과 같은지 검사한다.
// ex) deque에 있는 문자들 = abcdefg, 폭발 문자열 = gfz
// 1. g == g 2. f == f 3. e != g
int j = 0;
for (; j < bomb.length(); j++) {
if((char) ((List) deque).get(j) != bomb.charAt(bomb.length() - 1 - j)) break;
}
// 검사한 부분이 폭발 문자열과 동일할 경우, 검사한 부분을 pop해서 없애버린다.
if (j == bomb.length()) {
for (int k = 0; k < bomb.length(); k++) deque.pop();
}
}
StringBuilder answer = new StringBuilder();
int dequeSize = deque.size();
for (int i = 0; i < dequeSize; i++)
answer.append(deque.pollLast());
System.out.println(answer.isEmpty() ? "FRULA" : answer);
}
}