ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준] 9935번 문자열 폭발
    Algorithm Study/Python 2021. 9. 9. 23:35

    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로만 이루어져 있다.

     

    출력

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

     

     

     

    풀이

    예전에 프로그래머스 110 문자와 비슷한 문제이다.
    그 때는 스택을 이용하여 1, 1, 0을 찾으면서 비교하는 하드 코딩 형식으로 작성하였지만
    이번 문제는 찾을 문자열이 바뀌기 때문에 해당 방법으로 구현할 수 없다.

     

     

    전체 코드

    import sys
    string = sys.stdin.readline().strip()
    target = sys.stdin.readline().strip()
    
    stack = []
    
    for i in string:
        stack.append(i)
        if i == target[-1]:
            if target == ''.join(stack[-len(target):]):
                del stack[-len(target):]
    if stack:
        print(''.join(stack))
    else:
        print('FRULA')

    여전히 스택을 사용하여 이번에 전체 문자열을 순차탐색하면서 이번에 들어오는 문자가 target의 마지막 문자인 경우
    target의 길이만큼 stack을 비교하여 같은 경우에 모두 pop하였다.

    이렇게 구현하면 string 길이만큼 탐색과 최대 N번의 push가 일어나기 때문에 O(N)으로 해결할 수 있게 된다.
    110 문제도 이러한 방식으로 겨체한다면 더 좋은 코드를 만들 수 있을 것 같다.

    'Algorithm Study > Python' 카테고리의 다른 글

    [백준] 1057번 토너먼트  (0) 2021.09.11
    [백준] 1946번 신입사원  (0) 2021.09.10
    [백준] 5525번 IOIOI  (3) 2021.09.08
    [백준] 11000 강의실 배정  (0) 2021.08.30
    [백준] 22252번 정보 상인 호석  (0) 2021.08.24

    댓글

From BlackHair