관리 메뉴

커리까지

[백준] 9953번 문자열 폭발 파이썬 본문

알고리즘/풀이

[백준] 9953번 문자열 폭발 파이썬

목표는 커리 2022. 3. 4. 21:49
728x90
SMALL

문제

상근이는 문자열에 폭발 문자열을 심어 놓았다. 폭발 문자열이 폭발하면 그 문자는 문자열에서 사라지며, 남은 문자열은 합쳐지게 된다.

폭발은 다음과 같은 과정으로 진행된다.

  • 문자열이 폭발 문자열을 포함하고 있는 경우에, 모든 폭발 문자열이 폭발하게 된다. 남은 문자열을 순서대로 이어 붙여 새로운 문자열을 만든다.
  • 새로 생긴 문자열에 폭발 문자열이 포함되어 있을 수도 있다.
  • 폭발은 폭발 문자열이 문자열에 없을 때까지 계속된다.

상근이는 모든 폭발이 끝난 후에 어떤 문자열이 남는지 구해보려고 한다. 남아있는 문자가 없는 경우가 있다. 이때는 "FRULA"를 출력한다.

폭발 문자열은 같은 문자를 두 개 이상 포함하지 않는다.

입력

첫째 줄에 문자열이 주어진다. 문자열의 길이는 1보다 크거나 같고, 1,000,000보다 작거나 같다.

둘째 줄에 폭발 문자열이 주어진다. 길이는 1보다 크거나 같고, 36보다 작거나 같다.

두 문자열은 모두 알파벳 소문자와 대문자, 숫자 0, 1, ..., 9로만 이루어져 있다.

출력

첫째 줄에 모든 폭발이 끝난 후 남은 문자열을 출력한다.

예제 입력 1

mirkovC4nizCC44
C4

예제 출력 1

mirkovniz

예제 입력 2

12ab112ab2ab
12ab

예제 출력 2

FRULA

문제풀이

  • 처음에는 if text in list 이런 식으로 하나씩 비교해서 제거 하는 방식으로 생각했다.

    • 그러나 그렇게 하면 문자열과 일치하지 않는데도 하나만 일치해서 삭제해버리는 경우가 생긴다.
  • 그럼 문자열 마지막과 일치하면 그건 문자열과 일치할 가능성이 있다는 뜻이기에 그러한 식으로 진행하였다.

  • 먼저 입력받은 문자열들을 list로 변형시긴다.

    • split()을 하면 그냥 문자열로만 들어오고 리스트 형식으로 변형되지 않는다.
text = input().strip()
bomb = input().strip()
  • 폭발 문자열 길이와 마지막 단어를 변수에 담는다.
bomb_length = len(bomb)
bomb_last = bomb[-1]
  • textfor loop를 돌면서 먼저 answer에 담는다.
answer = []
for txt in text:
    answer.append(txt)
  • 그 다음에 지금 txtbomb_last(폭발 문자열 마지막) 이 일치하고 answer에서 지금들어온 문자까지 해서 bomb_length(폭발 문자열 길이)만큼 뒤에서 자른 문자열이 폭발 문자열과 일치하면 for loop를 돌면서 answer에서 문자열을 하나씩 제거한다.
answer = []
for txt in text:
    answer.append(txt)
    if txt == bomb_last and ''.join(answer[-bomb_length:]) == bomb:
        for _ in range(bomb_length):
            answer.pop()
  • 만약에 answer가 비어있지 않으면 문자열을 출력하고 비어있으면 FRULA 를 출력한다.
if answer:
    print(''.join(answer))
else:
    print('FRULA')

제출답안

import sys

input = sys.stdin.readline


def solution():
    text = input().strip()
    bomb = input().strip()
    bomb_length = len(bomb)
    bomb_last = bomb[-1]
    answer = []
    for txt in text:
        answer.append(txt)
        if txt == bomb_last and ''.join(answer[-bomb_length:]) == bomb:
            for _ in range(bomb_length):
                answer.pop()
    if answer:
        print(''.join(answer))
    else:
        print('FRULA')

solution()
728x90
LIST
Comments