ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] BOJ 9935 문자열 폭발
    코딩테스트/백준 2025. 2. 20. 16:38

    요구사항 

    • 시간 제한: 2초 
    • 메모리 제한: 128MB
    • 폭발 안할 거 처럼 보여도 (예제 입력1) 폭발하고 왼쪽 문자열과 오른쪽 문자열과 합쳤을 때, 폭발 문자열이라면 폭발한다.
    • 남아 있는 문자가 없는 경우 FRULA를 출력한다. 

    설계 1 

    • 문자열에 폭발 문자열을 반복적으로 찾는다.
    • 남아 있는 문자가 없는 경우 "FRULA"를 출력한다.
    import sys
    input = lambda: sys.stdin.readline().rstrip()
    
    sentence = input() # 입력 받은 문자열
    bomb = input()     # 폭발 문자열
    
    while bomb in sentence:
        sentence = sentence.replace(bomb, "")
    
    if not sentence:
        print("FRULA")
        exit()
    
    print(sentence)
    • 시간 초과 
    • 이유는 아마도 replace할 bomb 을 찾기 위해 O(N)이 걸릴거고 만약 최악의 경우 O(N**2)이 걸림.
    • 문자열의 길이는 1,000,000 폭발 문자열은 36 
    • 문자열의 길이가 최대 1,000,000이기 때문에 최악의 경우 2초를 넘기는 것.. (되다 말더라..)

    설계 2

    • 문자열을 돌면서 하나씩 스택에 넣는다.
    • 쌓인 스택과 bomb이 일치할 때, stack에서 bomb의 길이만큼 제거한다. 
    import sys
    input = lambda: sys.stdin.readline().rstrip()
    
    sentence = input() # 입력 받은 문자열
    bomb = input()     # 폭발 문자열
    bomb_len = len(bomb)
    stack = []
    
    for char in sentence:
        stack.append(char)
    
        if ''.join(stack[-bomb_len:]) == bomb:
            del stack[-bomb_len:]
    
    result = ''.join(stack)
    
    if result:
        print(result)
    else:
        print("FRULA")
    • [-bomb_len] 했을 때 끝에서부터 해당 길이만큼 똑바로 출력한다.
    • 예를 들어 bomb_len == 4 이고 stack = 'abcd' 라고 하자.
    • stack[-bom_len] == 'abcd' 이다. dcba 라고 생각할 수 있다. 헷갈렸음. 

    '코딩테스트 > 백준' 카테고리의 다른 글

    [Python] BOJ 1406 에디터  (0) 2025.02.20
    [Python] BOJ 11728 배열 합치기  (0) 2025.02.06
    [Python] BOJ 1269 대칭차집합  (0) 2025.02.06
    [Python] BOJ 8595 히든넘버  (0) 2025.02.03
    [Python] BOJ 28278 스택 2  (0) 2025.02.02
Designed by Tistory.