[백준] 9935 문자열 폭발

J. Hwang·2025년 2월 1일
0

coding test

목록 보기
95/108

문제

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

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

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

입력

첫째 줄에 문자열이 주어진다. 문자열의 길이는 1보다 크거나 같고, 1,000,000보다 작거나 같다.
둘째 줄에 폭발 문자열이 주어진다. 길이는 1보다 크거나 같고, 36보다 작거나 같다.
두 문자열은 모두 알파벳 소문자와 대문자, 숫자 0, 1, ..., 9로만 이루어져 있다.


출력

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


내 풀이

import sys
input = sys.stdin.readline

string = input().strip()
explode = input().strip()

while explode in string:
    string = string.replace(explode, '')
    
if len(string)==0:
    print('FRULA')
else:
    print(string)

위와 같이 풀었더니 44%쯤 채점하다가 시간 초과가 떠서 오답 처리되었다.

아래는 시간 복잡도를 고려해서 정답을 받은 코드 (코멘트 참조)

import sys
input = sys.stdin.readline

string = input().strip()
explode = input().strip()
L = len(explode)

stack = []
for s in string:
    stack.append(s)
    if ''.join(stack[-L:])==explode:
        del stack[-L:]

answer = ''.join(stack)

if len(answer)==0:
    print('FRULA')
else:
    print(answer)

코멘트

처음 풀이와 같이 replace()를 이용하면 문자열 전체를 탐색하면서 폭발 문자열을 찾고 새로운 문자열을 반환하기 때문에 O(N2)O(N^2) 이상의 시간 복잡도가 발생하게 된다고 한다. 이는 메모리와 연산 속도 면에서 매우 비효율적이다.
이 때 스택을 이용하면 문자열을 한 번만 순회해서 폭발 문자열을 찾고 제거할 수 잇으므로 O(N)O(N)의 시간 복잡도로 해결할 수 있다.


References

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

profile
Let it code

0개의 댓글