from collections import deque as dq
import sys
t = int(sys.stdin.readline())
def conduct_AC(func, deque):
reversed = 1
for i in range(len(func)):
f = func[i]
if f == 'R':
reversed = -reversed
elif f == 'D':
if len(deque)==0:
print('error')
return
if reversed == 1:
deque.popleft()
else:
deque.pop()
if reversed == -1:
deque.reverse()
ans = ''
for i in range(len(deque)):
ans = ans + str(deque[i])
if i < len(deque)-1:
ans += ','
print(f'[{ans}]')
for i in range(t):
deque = dq()
func = sys.stdin.readline()
n = int(sys.stdin.readline())
input = sys.stdin.readline().strip('[]\n')
if n>0:
list = [int(item) for item in input.split(',')]
deque.extend(list)
conduct_AC(func, deque)
입력이 특이했던 문제. 세 줄을 한 세트로 받아와야 했다.conduct_AC라는 함수를 만들어서 그 함수를 for문으로 테스트 케이스 개수만큼 실행했다. 그리고 입력에 대괄호가 포함되어 있어서 그것도 없애줘야했다^__^. 출력도 그냥 리스트를 출력하면 틀려서 일일이 문자열을 이어붙여야 했다...[1, 2, 3] 아니고 [1,2,3]으로 출력해야됨
strip()
의 인자로 문자열의 양끝에서 삭제하고 싶은 문자열을 넣어주면 손쉽게 제거할 수 있다.deque.extend(array)
를 하면 배열을 단번에 deque에 넣을 수 있다. 정확히는 배열을 순회하면서 deque의 오른쪽에 추가하는 메소드이다. => deque(array) 해도 된다고함!join("[" + ",".join(deque) + "]")
배열의 순서를 뒤집는 연산은 시간복잡도가 O(N)이다. 최대한 피해야 한다.
배열을 실제로 뒤집을 필요가 없다. 원래 D일 때 왼쪽에서 삭제했다면, 뒤집고 난 후에는 오른쪽에서 삭제하면 된다.
12345의 오른쪽에서 5를 삭제하는 것과 54321의 왼쪽(기본)에서 5을 삭제하는 건 결국 똑같다.
deque의 pop()과 popleft()를 사용했다.
reversed
라는 변수를 선언해 1을 할당했다. 명령어 R이 나오면 이 값을 -reversed
로 바꿨다. 어차피 이 값은 pop()을 하냐 popleft()를 하냐 이걸 결정하는데만 쓰이기 때문에 몇 번 뒤집혔는지를 기록할 필요가 전혀 없다. 어차피 0번 뒤집기 == 2번 뒤집기 == 4번 뒤집기 == ... 다. 뒤집는 과정에서 원소가 삭제되어도 어차피 맨 끝에서 삭제하기 때문에 순서에는 영향이 없다.
다만 답을 출력할 때는 실제로 배열을 뒤집어서 출력해야 하므로, 출력 전에 reversed
값을 확인해 -1이면 deque.reverse()를 해준다.
참고로 deque = deque.reverse() 이렇게 재할당을 할 필요 없이 deque.reverse()만 하면 된다. 재할당을 하면 내가 원하는 작업이 잘 수행 되지 않는다. (파이썬에서 이런 실수 많이 했었는데 이게 파이썬 특징인건지 모르겠다. 무튼 JS랑은 다르다.)