solved_ac[Class4][문자열 폭발](https://www.acmicpc.net/problem/9935)
상근이는 문자열에 폭발 문자열을 심어 놓았다. 폭발 문자열이 폭발하면 그 문자는 문자열에서 사라지며, 남은 문자열은 합쳐지게 된다.
폭발은 다음과 같은 과정으로 진행된다.
상근이는 모든 폭발이 끝난 후에 어떤 문자열이 남는지 구해보려고 한다. 남아있는 문자가 없는 경우가 있다. 이때는 "FRULA"를 출력한다.
폭발 문자열은 같은 문자를 두 개 이상 포함하지 않는다.
첫째 줄에 문자열이 주어진다. 문자열의 길이는 1보다 크거나 같고, 1,000,000보다 작거나 같다.
둘째 줄에 폭발 문자열이 주어진다. 길이는 1보다 크거나 같고, 36보다 작거나 같다.
두 문자열은 모두 알파벳 소문자와 대문자, 숫자 0, 1, ..., 9로만 이루어져 있다.
첫째 줄에 모든 폭발이 끝난 후 남은 문자열을 출력한다.
mirkovC4nizCC44
C4
mirkovniz
12ab112ab2ab
12ab
FRULA
stack에 대한 문제이다. 폭발 문자가 완성이 되려면 순서대로 한개씩 집어넣으면서 무조건 폭발 문자의 뒷 문자를 기준으로 검사를 해야한다. CC44 문자를 예로 들면 앞에서 검사를 하게 되었을 때, 앞에 먼저 나온 C를 다른 곳에 저장을 하고 가운데 C4 문자를 폭발시킨 후, 저장한 C 문자를 불러와서 뒷 문자랑 합치고 검사를 해야한다. 지금은 폭발 문자가 2개밖에 없어서 쉬워 보이지만 여러개가 생기면 많은 메모리를 잡아먹게 된다. 그런데 뒤에서 검사를 하게 되면 C4의 4가 stack에 들어갔을 때, 폭발 문자의 길이만큼 앞의 문자를 검사해서 pop 시킨 후 다시 또 폭발 문자의 뒷문자를 찾게 된다. 그렇게 되면 다른 메모리 공간을 이용하지 않아도 된다.
import sys
input_str = sys.stdin.readline().rstrip()
bomb_str = sys.stdin.readline().rstrip()
bomb_end_str = bomb_str[-1]
bomb_len = len(bomb_str)
stack = []
for i in range(len(input_str)):
stack.append(input_str[i])
if stack[-1] == bomb_end_str and len(stack) >= bomb_len:
count = 0
for j in range(bomb_len):
if stack[-1 - j] == bomb_str[-1 - j]:
count += 1
if count == bomb_len:
for _ in range(bomb_len):
stack.pop()
if len(stack) == 0:
print("FRULA")
else:
for i in stack:
print(i, end="")
stack에 대해서 생각하는데 시간이 오래 걸리고 문제를 푸는데는 오래 걸리지 않았다. 문제를 보자마자 어떤 자료구조를 쓸지 생각을 할 수 있을 정도로 공부를 많이 하는게 답인것 같다.