happy318
팽도리블로그
happy318
전체 방문자
오늘
어제
  • 전체글 (252)
    • 공부 (5)
      • Algorithm 정리 (0)
      • 논문리뷰 (1)
      • C++ (2)
      • Python (2)
      • Java (0)
      • Back-end (0)
      • Front-end (0)
      • Embedded (0)
    • 코딩테스트 (218)
      • Python 문제풀이 (100)
      • C++ 문제풀이 (108)
      • Python template (9)
      • C++ template (1)
    • 일상 (20)
      • 맛집 (13)
      • 쇼핑 (5)
      • 아무 일상 (2)
    • 게임 (9)
      • 메이플스토리 (9)

최근 글

인기 글

hELLO · Designed By 정상우.
happy318

팽도리블로그

코딩테스트/Python 문제풀이

[백준] 문자열 폭발

2022. 6. 26. 00:39

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

 

9935번: 문자열 폭발

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

www.acmicpc.net

스택(stack)을 이용하는 문제입니다. 

 

우선 문제부터 간단하게 요약하면, 문자열이 있고, 폭탄이 주어집니다. 문자열중 폭탄에 해당하는 문자열이 있는 경우 사라집니다. 이렇게 사라진 문자열에서 또 다시 폭탄에 해당하는 문자열이 있으면 또 사라집니다. 이 과정을 반복해 남는 문자열을 만드는 문제입니다. 

 

python에서는 문자열의 find 메소드를 제공합니다. 가장 처음에는 이 방법을 시도해서 문제를 해결하려 했으나 시간초과가 남을 알 수 있었습니다. 

 

정답을 먼저 설명하고, 잘못된 풀이 또한 적도록 하겠습니다.

 

<Solution>

이 문제의 아이디어는 문자를 하나씩 넣으면서 stack의 끝쪽을 확인해서 만약 끝쪽에 폭탄이 있다면 제거하면 됩니다. 이렇게 하면, O(문자열의 길이) 의 시간 복잡도로 해결이 가능합니다. 

 

예시를 통해 확인해 봅시다.

 

ababcc라는 문자열과 폭탄 abc를 생각해봅시다.

stack = []
...
stack = [a,b,a] -> 끝의 세문자 != abc
stack = [a,b,a,b] -> 끝의 세문자 != abc
stack = [a,b,a,b,c] -> 끝의 세문자 = abc 이기에 제거
stack = [a,b,c] -> 끝의 세문자 = abc 이기에 제거
stack = []

이러한 과정을 통해 문제를 해결할 수 있습니다. 

 

실제 구현은 아래와 같습니다.

import sys

string = sys.stdin.readline().rstrip()
bomb = sys.stdin.readline().rstrip()

stack = []
for s in string:
    stack.append(s)
    if len(stack) < len(bomb):
        continue
    # check from right
    if ''.join(stack[-len(bomb)::]) == bomb:
        for _ in range(len(bomb)):
            stack.pop()

print(''.join(stack)) if len(stack) != 0 else print('FRULA')

 

<잘못된 풀이>

python string 메소드 find를 이용한 풀이입니다. (시간초과)

import sys

string = sys.stdin.readline().rstrip()
bomb = sys.stdin.readline().rstrip()

while(1):
    index = string.find(bomb)

    if index == -1:
        if len(string) == 0:
            print('FRULA')
            break
        else:    
            print(string)
            break
    else:
        string = string[:index] + string[index+len(bomb):]
반응형

'코딩테스트 > Python 문제풀이' 카테고리의 다른 글

[백준] 최소비용 구하기  (0) 2022.06.28
[백준] 공통 부분 문자열  (0) 2022.06.28
[백준] N과 M (2)  (0) 2022.06.25
[백준] 2048 (Easy)  (0) 2022.06.25
[백준] 웜홀  (0) 2022.06.25
    '코딩테스트/Python 문제풀이' 카테고리의 다른 글
    • [백준] 최소비용 구하기
    • [백준] 공통 부분 문자열
    • [백준] N과 M (2)
    • [백준] 2048 (Easy)
    happy318
    happy318

    티스토리툴바