문제/백준_파이썬

163. 5430(AC) - 파이썬

sm_hope 2022. 7. 28. 08:51
from collections import deque
import sys

input = sys.stdin.readline

T = int(input())

for _ in range(T):
    p = list(input().rstrip())
    n = int(input())
    x = input()
    x = x.replace("[", "")
    x = x.replace("]", "")
    x = x.replace(",", " ")
    queue = deque(list(x.split()))
    R_cnt = 0
    error = False

    for val in p:
        if val == 'R':
            R_cnt += 1
            continue
        if val == 'D' and len(queue) == 0:
            error = True
            break
        else:
            if R_cnt % 2 == 0:
                queue.popleft()
            else:
                queue.pop()

    if error:
        print("error")

    else:
        if R_cnt % 2 == 1:
            queue.reverse()

        print("[" + ",".join(list(queue)) + "]")

문제요약

R은 뒤집기 D는 앞의 자리수 제거 를 진행해라. 만약 D를 했을 때 큐 내에 값이 없다면 "error"를 출력해라.

설명

문제는 크게 어렵지 않으나 트릭이 숨어 있다.

 

1. 정직하게  R일때 바로바로 뒤집으면 시간 초과가 발생한다.

2. x가 비어있을 때 []를 출력해야한다.

 

이 두가지를 지키면 크게 어렵지 않다.

 

    p = list(input().rstrip())
    n = int(input())
    x = input()
    x = x.replace("[", "")
    x = x.replace("]", "")
    x = x.replace(",", " ")
    queue = deque(list(x.split()))
    R_cnt = 0
    error = False

 

입력값들을 처리해 주었다. 

x는 [1,3,4]와 같은 형식으로 들어오기때문에 사전 작업이 필요하다.

 

        if val == 'R':
            R_cnt += 1
            continue

R인 경우 바로바로 뒤집지 않고 먼저 카운터를 증가시킨다.

나중에 한번에 처리할 것이다.

        if val == 'D' and len(queue) == 0:
            error = True
            break

D이고 큐 내에 값이 없다면 에러대상이다.

        else:
            if R_cnt % 2 == 0:
                queue.popleft()
            else:
                queue.pop()

에러 대상이 아니라면 D를 수행할 수 있다는것 따라서  D를 수행하는데 수행하기 앞서 먼저 조건문으로 처리를 해보자.

만약, R_cnt 를 2로 나눈 나머지가 0이라면 뒤집지 않았다는 것이므로 맨 처음 값을 바로 빼준다.

2로 나누어 지지 않으면 뒤집어야 한다는 소리이므로 뒤집어 지면 맨뒤가 처음으로 빠지므로 맨 뒤에 있는 값을 빼준다.

 

    if error:
        print("error")

    else:
        if R_cnt % 2 == 1:
            queue.reverse()

        print("[" + ",".join(list(queue)) + "]")

우리는 값이 없다면, []를 출력해야 하기 때문에 에러를 먼저 조건문으로 처리해준다.

에러가 아니라면 값을 처리해주는데,

여기서 뒤집기를 진행한다.