[백준] 문자열 폭발

최동혁·2022년 12월 6일
0

백준

목록 보기
45/68

문자열 폭발

solved_ac[Class4][문자열 폭발](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

문제 해석

stack에 대한 문제이다. 폭발 문자가 완성이 되려면 순서대로 한개씩 집어넣으면서 무조건 폭발 문자의 뒷 문자를 기준으로 검사를 해야한다. CC44 문자를 예로 들면 앞에서 검사를 하게 되었을 때, 앞에 먼저 나온 C를 다른 곳에 저장을 하고 가운데 C4 문자를 폭발시킨 후, 저장한 C 문자를 불러와서 뒷 문자랑 합치고 검사를 해야한다. 지금은 폭발 문자가 2개밖에 없어서 쉬워 보이지만 여러개가 생기면 많은 메모리를 잡아먹게 된다. 그런데 뒤에서 검사를 하게 되면 C4의 4가 stack에 들어갔을 때, 폭발 문자의 길이만큼 앞의 문자를 검사해서 pop 시킨 후 다시 또 폭발 문자의 뒷문자를 찾게 된다. 그렇게 되면 다른 메모리 공간을 이용하지 않아도 된다.

풀이

  • 입력 받은 문자열의 길이 만큼 루프를 돌면서 stack에 한 개씩 append를 해준다.
  • 만약 stack에 들어간 문자 중 가장 최근에 들어온 문자가 폭발 문자의 마지막 문자와 같다면? 그리고 stack의 길이가 폭발 문자의 길이보다 크다면?
    • 폭발 문자의 길이만큼 루프
      • 폭발 문자와 stack에 들어가있는 문자가 같은지 확인
    • 루프를 다 돌았는데 문자가 같다면?
      • 폭발 문자를 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에 대해서 생각하는데 시간이 오래 걸리고 문제를 푸는데는 오래 걸리지 않았다. 문제를 보자마자 어떤 자료구조를 쓸지 생각을 할 수 있을 정도로 공부를 많이 하는게 답인것 같다.

profile
항상 성장하는 개발자 최동혁입니다.

0개의 댓글