ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] BOJ 9935: 문자열 폭발
    코딩테스트/백준 2024. 11. 20. 09:04

    요구사항

    • 시간 제한 2초
    • 메모리 제한 128MB
    • 비어 있다면 FRULA를, 아니라면 폭발 후 문자열을 출력하라

    설계 1

    • 입력 받은 문자열(line) 과 비교할 문자열(target) 을 받는다.
    • line 에서 target 기준으로 왼쪽과 오른쪽으로 나누어 저장한다.
    • line을 업데이트 한다. line = left + right
    • 요구사항에 맞게 출력한다. 

    구현 1

    import sys
    input = lambda: sys.stdin.readline().rstrip()
    
    line = input()
    target = input()
    
    # 결과 문자열
    while target in line:  # 더 이상 target이 없을 때까지 반복
        index = line.find(target)  # target의 시작 위치
        left_stack = line[:index]  # target의 왼쪽 부분
        right_stack = line[index + len(target):]  # target의 오른쪽 부분
        line = left_stack + right_stack  # target 제거
    
    # 최종 결과 출력
    if line == '':
        print("FRULA")
    else:
        print(line)
    • 원한 출력결과는 나왔지만, 시간 초과가 난다. 
    • 아마 계속 line을 순회하고 거기서 또 index를 찾아서 그런 거 같다.

    설계 2 

    • line의 알파벳을 하나씩 스택에 넣자
    • 그리고 만약 stack 에 쌓인 target의 길이를 봤는 데 target과 같다면 stack에서 빼준다. 

    구현 2

    import sys
    input = lambda: sys.stdin.readline().rstrip()
    
    line = input()
    bomb = input()
    bomb_len = len(bomb)
    
    stack = []
    
    for i in line:
        stack.append(i)
    
        if ''.join(stack[-bomb_len:]) == bomb:
            del stack[-bomb_len:]
    
    result = ''.join(stack)
    
    if result:
        print(result)
    else:
        print("FRULA")
    • if ''.join ~ 이 부분을 설명해주겠다. 
    • 만약 현재 stack이 [ 'a', 'b', 'c', '4' ] 이라고 하자. 그리고 bomb 은 c4이다. 
    • [-bomb_len]는 현재 2로 슬라이싱 해야된다. [-2:] -> ['c', '4'] 가 된다.
      • 요것은 ''.join 으로 붙여 "c4" 가 된다. == bomb 과 같은 지 체크한다. 

    기타 헷갈렸던 부분 다시 정리

    a = "pratice"
    
    print(a[-3:])
    print(a[3:])
    print(a[:3])
    print(a[:-3])
    
    # 출력 결과
    ice
    tice
    pra
    prat
    • 대원칙 하나만 기억하자. 
    • [출발 : 도착 : 점프]
    • 첫 번째의 경우
      • 출발: -3 -2 -1. 0은 없음 따라서 ice가 됩니다.
    • 두 번째의 경우
      • 출발: 3, 도착: 끝까지. 
    • 세 번째의 경우
      • 출발: 0번 째 인덱스, 도착: 인덱스 2 이까지 
    • 네 번째의 경우
      • 출발: 0번째 인덱스, 도착: 뒤에서 3번 째 앞까지

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

    [Python] BOJ 28278 스택 2  (0) 2025.02.02
    [Python] BOJ 7562: 나이트의 이동  (1) 2024.11.27
    [Python] BOJ 10026: 적록색약  (0) 2024.11.19
    [Python] BOJ 2178 미로탐색  (0) 2024.11.01
    [Python] BOJ 1926 : 그림  (0) 2024.10.29
Designed by Tistory.