💡 함부로 파이썬 메소드를 사용하지 말고, 시간복잡도 측면에서 더 나은 코드가 있는지 확인해보자!!

<시간 초과 코드>
import sys
from collections import deque
input = sys.stdin.readline
T = int(input())
for _ in range(T):
func = deque(input().rstrip())
num = int(input())
element = input().rstrip()
dq = deque(element[i] for i in range(1,(num*2+1),2))
flag = 0
while func:
if func.popleft() == 'R':
dq.reverse()
else:
if dq:
dq.popleft()
else:
flag = 1
break
if flag != 1:
print(list(map(int,dq)))
else:
print("error")
< 런타입 에러 코드 >
import sys
from collections import deque
input = sys.stdin.readline
T = int(input())
for _ in range(T):
func = deque(input().rstrip())
num = int(input())
element = input().rstrip()
dq = deque(int(element[i]) for i in range(1,(num*2+1),2))
flag = 0
# reverse 여부로, 뒤집히면 flag가 바뀐다 ( 정상: 1, 반대: -1 )
rflag = 1
while func:
if func[0] == 'R':
rflag *= -1
elif func[0] == 'D' and rflag == 1:
if dq:
dq.popleft()
else:
flag = 1
elif func[0] == 'D' and rflag == -1:
if dq:
dq.pop()
else:
flag = 1
func.popleft()
if flag != 1 and rflag == 1:
print(list(dq))
elif flag != 1 and rflag == -1:
print(list(reversed(dq)))
else:
print("error")
<정답 코드>
import sys
from collections import deque
input = sys.stdin.readline
T = int(input())
for _ in range(T):
func = deque(input().rstrip())
num = int(input())
# num에 0이오면 무시할 수 있도록 설정
dq = deque(map(int,input()[1:-2].split(','))) if num > 0 else deque(input()[1:-2])
flag = 0
# reverse 여부로, 뒤집히면 flag가 바뀐다 ( 정상: 1, 반대: -1 )
rflag = 1
while func:
if func[0] == 'R':
if dq:
rflag *= -1
elif func[0] == 'D' and rflag == 1:
if dq:
dq.popleft()
else:
flag = 1
break
elif func[0] == 'D' and rflag == -1:
if dq:
dq.pop()
else:
flag = 1
break
func.popleft()
if flag != 1 and rflag == 1:
print("[",end='')
for i in range(len(dq)):
print(dq[i], end=',' if i != len(dq) - 1 else '')
print("]")
elif flag != 1 and rflag == -1:
print("[",end='')
for i in range(len(dq)-1,-1,-1):
print(dq[i], end=',' if i != 0 else '')
print("]")
else:
print("error")

💡 코테스터디에서 나온 기발한 풀이법
혜진님 : join을 사용하여 출력 시간을 많이 줄이셨다.
=> print('[' + ','.join(q) +']')
서현님: pop()과 popleft()를 사용하지 않고, index로만 진행하였다.
for _ in range(T):
P = s.readline().rstrip()
N = int(s.readline())
try:
A = list(map(int, s.readline().rstrip()[1:-1].split(',')))
except:
A = []
cnt_d = P.count("D")
if cnt_d > N:
print('error')
continue
else:
ind_front = 0
ind_back = N-1
rev = 1
for p in P:
if p == 'R':
tmp = ind_front
ind_front = ind_back
ind_back = tmp
rev *= -1
else:
ind_front += rev
res = [A[ind] for ind in range(ind_front, ind_back+rev,rev)]
print(f"[{",".join(map(str, res))}]")
=> pop()을 직접적으로 이용하지 않고, pop되는 index만 범주에서 제거하면서 출력 범주를 줄이는 방식을 사용하셨다.