골드5의 구현 문제.. 입출력이 상당히.. 까다롭다.

입력

[1,2,3,4] 형태로 입력되기 때문에 [1:-2]로 나눈 다음에 콤마 단위로 스플릿하고 map으로 int의 리스트로 만들었다.

출력

파이썬에서 print함수로 출력을 하면 [1, 2, 3]과 같이 공백이 함께 출력되는데, [1,2,3]과 같이 출력이 되야한다. 그래서 join으로 스트링으로 만들어서 출력했다.


풀이

R이 입력되었을 때 리스트를 reverse() 또는[::-1]로 뒤집으면 시간 초과가 발생한다. 그때마다 O(N)의 시간이 소요되기 때문에 rvsFlg를 둬서 D 명령이 들어올 때나, 마지막에 출력할 때 플래그 값에 따라 뒤집었는지, 안뒤집었는지에 맞게 동작하도록 했다. 이렇게 했더니 시간초과는 안뜨고 통과했다. 다만 리스트를 사용해서 요소를 지우는 del 함수를 사용할 때마다 O(N)이 소요된다. 따라서 O(1)인 dequepop() popleft()를 사용하는 게 더 빠르다. 그래서 deque를 써서 개선한 코드도 첨부한다.


리스트 사용

import sys
input = sys.stdin.readline
t = int(input())

for _ in range(t):
    func = input().strip()
    n = int(input())
    if n != 0:
        nums = list(map(int, input()[1: -2].split(',')))
    else:
        n = input()
        nums = []

    errFlg, rvsFlg = False, False

    for cmd in func:
        if cmd == "R":
            rvsFlg = (False if rvsFlg else True)
        elif cmd == "D":
            if len(nums) != 0:
                if rvsFlg:
                    del nums[-1]
                else:
                    del nums[0]
            else:
                errFlg = True
                break

    if not errFlg:
        print("["+','.join(map(str, nums[::-1]))+"]")
        if rvsFlg else print("["+','.join(map(str, nums))+"]")
    else:
        print("error")


deque 사용

import sys
from collections import deque

input = sys.stdin.readline
t = int(input())

for _ in range(t):
    func = input().strip()
    n = int(input())
    if n != 0:
        nums = list(map(int, input()[1: -2].split(',')))
        nums = deque(nums)
    else:
        n = input()
        nums = deque()

    errFlg, rvsFlg = False, False

    for cmd in func:
        if cmd == "R":
            rvsFlg = (False if rvsFlg else True)
        elif cmd == "D":
            if len(nums) != 0:
                if rvsFlg:
                    nums.pop()
                else:
                    nums.popleft()
            else:
                errFlg = True
                break

    if not errFlg:
        print("["+','.join(map(str, reversed(nums))) +
              "]") if rvsFlg else print("["+','.join(map(str, nums))+"]")
    else:
        print("error")


Reference