[백준 BOJ_5430] AC Python 풀이
출처: 백준 온라인 저지
문제
풀이
우선 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