[백준 BOJ_5430] AC Python 풀이

출처: 백준 온라인 저지

문제

image

풀이

우선 p와 n의 값을 받은 뒤, 배열형식의 문자열을 배열로 바꿔줍니다.

배열을 deque로 바꿔주어 pop과 popleft를 자유자재로 사용할 수 있게 합니다.

func_num에 연속되는 함수의 개수를 세어줍니다.

연속되는 함수가 R일 때는 func_num이 홀수라면 reversed를 1로, 짝수라면 reversed를 0으로 바꿔줍니다.

D의 경우에는 우선 func_num이 현재 배열의 크기보다 크다면 result에 “error”를 넣어주고 바로 break해줍니다. 그렇지 않을 경우에는 그 수만큼 pop이나 popleft를 해주는데, 배열이 뒤집힌 상태라면(reversed=1) pop을, 뒤집히지 않은 상태라면(reversed=0) popleft를 해줍니다.

모든 함수를 다 수행하고 나서는 result에 배열형식의 문자열로 다시 바꿔 저장해주는데, 이때도 reversed를 확인해주고 뒤집힌 상태라면 배열을 뒤집은 상태에서 문자열로 바꾼 뒤 result를 출력해줍니다.

코드

from collections import deque
import sys
input = sys.stdin.readline
T = int(input())
for _ in range(T):
  p = input()
  n = int(input())
  arr = input().rstrip().replace("[", "").replace("]","")
  arr = arr.split(",") if arr else []
  arr = deque(arr)
  result = ""
  start_idx = 0
  end_idx = 1
  reversed = 0
  while end_idx <= len(p):
    if end_idx < len(p) and p[start_idx] == p[end_idx]:
      end_idx += 1
    else:
      func_num = end_idx - start_idx
      if p[start_idx] == "R" and func_num % 2:
        reversed = 0 if reversed else 1
      elif p[start_idx] == "D":
        if func_num > len(arr):
          result = "error"
          break
        else:
          for _ in range(func_num):
            if reversed:
              arr.pop()
            else:
              arr.popleft()
          # arr = arr[:len(arr)-func_num] if reversed else arr[func_num:]
      start_idx = end_idx
      end_idx = start_idx+1
  else:
    if reversed:
      arr.reverse()
    result = "[" + ",".join(arr) + "]"
  print(result)

Leave a comment