바킹독 덱 강의 연습 문제
처음에 풀고 나서 시간 초과가 나서 찾아봤더니 reverse()
의 비용이 높아서 그런 거였다. R
을 만날 때마다 reverse()
를 실행하는 것이 아니라 그 개수를 세서 홀수인 경우에 한 번만 실행하도록 한다. D
연산도 R
의 개수가 짝수인지 홀수인지에 따라 popleft()
나 pop()
을 실행한다.
배열 인덱스를 a[i:j]
와 같이 명시하면 i
번째부터 j -1
번째 원소까지 포함하는 새로운 배열을 반환한다.
from collections import deque
t = int(input()) # 테스트 케이스 수
for i in range(t) : # 테스트 케이스 수만큼 반복
p = input() # 수행할 함수 예) RDD
n = int(input()) # 배열의 길이
tmp = input() # 배열에 들어있는 정수 예) [1,2,3,4]
d = deque(tmp[1:-1].split(',')) # tmp를 덱에 담기
error = False # error 플래그
cnt_r = 0 # R 연산의 개수를 셀 변수
for func in p : # p에 들어있는 각 함수에 대해 반복
if func == 'R' : # 함수가 R이면
cnt_r += 1 # cnt_r을 1 증가
elif func == 'D' : # 함수가 D면
if len(d) == 0 or (len(d) == 1 and d[0] == '') : # 들어있는 원소가 없으면
error = True # error 플래그는 True
break # 반복문 빠져나오기
if cnt_r % 2 == 0 : # R 연산의 개수가 짝수면
d.popleft() # 뒤집기가 일어나지 않은 것이므로 앞의 원소 제거
else : # R 연산의 개수가 홀수면
d.pop() # 뒤집기가 일어난 것이므로 뒤의 원소 제거
if error : # error 플래그가 True면
print('error') # error 출력
else : # error 플래그가 False면
if cnt_r % 2 == 1 : # R 연산의 개수가 짝수면
d.reverse() # reverse 실행
print('[' + ','.join(d) + ']') # 덱의 원소 전체 출력