기록하는삶

[코딩 테스트 연습(파이썬/Python)] 백준 9935번 _ 문자열 폭발 본문

백준(Python)/문자열

[코딩 테스트 연습(파이썬/Python)] 백준 9935번 _ 문자열 폭발

mingchin 2021. 12. 25. 13:29
728x90
반응형

https://www.acmicpc.net/problem/9935

 

9935번: 문자열 폭발

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

www.acmicpc.net

[문제]

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

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

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

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

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

 

[입력]

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

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

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

[출력]

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

 

[아이디어]

1) re 모듈 활용 -> 시간초과

2) stack 활용

 

# 시간초과 (1)
import re
s=input()
k=input()
kk = re.compile(k)
while k in s:
    s=re.sub(kk,'',s)
print(s) if s else print('FRULA')

# 시간초과 (2)
s=input()
k=input()
n=len(k); stack=[]; kk=list(k)
for x in s:
    stack.append(x)
    if stack[-n:]==kk:
        stack = stack[:-n]
print(''.join(stack)) if stack else print('FRULA')

처음 생각나는 방법들이 시간초과가 났다. 로직 자체는 간단한데 2초 안에 해결하는게 핵심이다.

 

# 통과
s=input()
k=input()
n=len(k); stack=[]; kk=list(k)
for x in s:
    stack.append(x)
    if stack[-n:]==kk:
        del stack[-n:]
print(''.join(stack)) if stack else print('FRULA')

달라진 부분이 하나빡에 없는데, '원래 있는 stack이라는 배열에서 삭제하기 vs stack이라는 배열 재할당하기'에서 차이가 갈렸다. 아무래도 배열을 새로 할당하는 것이 기존 배열의 위치 외에 다른 위치를 현재 길이만큼 확보해야 하기 때문에 시간이 오래 걸리는 것 같다. 항상 새로 할당하는 방법을 사용했던 것 같은데, stack에서 하나를 pop하는게 아니라 여러 원소를 동시에 pop하고자 하는 경우 del 활용법을 기억해둬야겠다.

728x90
반응형