반응형
[Gold V] AC - 5430
[골드 5] AC - 5430
문제 링크: https://www.acmicpc.net/problem/5430
예제 입력 1)
4
RDD
4
[1,2,3,4]
DD
1
[42]
RRD
6
[1,1,2,3,5,8]
D
0
[]
예제 출력 1)
[2,1]
error
[1,2,3,5,8]
error
전체 코드
1) 가장 짧은 코드
from collections import deque
for _ in range(int(input())):
c=input()
n=int(input())
q=deque(eval(input()))
try:
step=1
for p in c:
if p=="R":
step*=-1
else:
q.popleft() if step==1 else q.pop()
print(str(list(q)[::step]).replace(" ",""))
except:
print('error')
이 코드는 빈 배열을 입력 받을 때에 대한 예외가 없어도 돼서 편하다.
- eval() 함수를 활용해서 빈 배열([])에 대한 예외처리를 하지 않아도 된다.
- 빈 deque에서 pop을 하려고 하면 어차피 오류가 나기 때문에 try-except 문을 사용했다.
- 슬라이싱 ([start : end : step]) 을 활용해서
li[::-1]이런 식으로 리스트를 거꾸로 출력할 수 있다.
li[::1]은 그냥 li와 같다.
따라서 R이 나올 때 마다 1, -1, 1, -1, 1, -1... 이런 식으로 값을 바꿔주면 된다.
step을 처음에는 1로 설정하고, R이 나올 때 마다 step에 -1을 곱해준다.
이렇게 하면 마지막 출력 시에 list(q)[::step] 형태로 활용할 수 있다.
2) 가장 빠른 코드 (204 ms)
from collections import deque
for _ in range(int(input())):
commands = input()
n = int(input())
arr = input()
if n < commands.count('D'):
print 'error'
elif n == 0:
print '[]'
else:
queue = deque(arr[1:-1].split(','))
isReversed = False
for cmd in commands:
if cmd == 'R':
isReversed ^= True
else:
(queue.pop() if isReversed else queue.popleft())
print '[' \
+ ','.join((reversed(queue) if isReversed else queue)) + ']'
- eval()을 쓰지 않고 split()을 활용했다. 따라서 n이 0일때 예외처리를 해줬다.
- n이 D의 개수보다 작으면 'error'를 출력한다.
- step 대신 isReversed라는 bool타입 변수를 사용했다.