배열을 선언하고 명령어에 따라 뒤집거나 앞의 원소를 빼면 값은 맞게 나오지만 시간 초과가 걸리는 문제였다. 

 

1. 전처리

- 배열을 두 번 뒤집는 것은 아무 일도 하지 않는 것과 같기 때문에 명령어에 "RR"이 들어간 경우 이를 제거해주었다. 

 

- 배열이 빈 배열인데 명령어에 "D"가 들어가면 배열을 순회하기 전에 오류로 판단하였다. 

 

2. 배열 순회

- "D"가 나올 때마다 뒤집으면 deque를 사용해도 시간초과가 나는 것 같았다. 따라서 reverse라는 변수를 추가하고, 현재 D가 몇 번 나왔는지를 기록하는 데 사용했다. 

(D가 홀수 번 나왔으면 reverse=True로 배열이 뒤집혀야 하는 상태이고, 짝수 번 나왔으면 reverse=False로 배열이 원래 상태이다.)

 

- "R"이 나올 때는 reverse의 변수 값만 바꿔주었다. "D"가 나오면 reverse의 값에 따라 맨 앞의 원소를 뺄지(배열이 그대로 있는 상태), 맨 뒤의 원소를 뺄지(배열이 뒤집힌 상태)를 결정하였다.

배열은 리스트가 아니라 데크(deque)를 사용했기 때문에 원소를 빼는 작업은 O(1)이 걸렸다. 

 

- 마지막에는 배열을 그대로 출력해야 했기 때문에 reverse=True일 때만 마지막으로 한 번 뒤집어 주었다. 

 

import sys
from collections import deque
input = sys.stdin.readline

T = int(input())
for _ in range(T):
    is_error = False
    arr = deque([])
    commands = input().strip().replace("RR", "")
    length = int(input())
    string = input().strip()
    reverse = False
    if not string == "[]":
        arr = deque(string.replace("[", "").replace("]", "").split(","))
    if len(arr) == 0 and "D" in commands:
        is_error = True
    if not is_error:
        for command in commands:
            if command == "R":
                reverse = not reverse
            else:
                if len(arr) == 0:
                    is_error = True
                    break
                if not reverse:
                    arr.popleft()
                else:
                    arr.pop()
                     
    if is_error:
        print("error")
    else:
        if reverse:
            arr.reverse()
        print("[", end="")
        print(",".join(arr), end="")
        print("]")

 

+ Recent posts