처음에는 R명령 시 진짜로 리스트를 뒤집어서 계속 시간초과가 났다. 그래서 실제로 뒤집지는 않고 rFlag 변수를 선언해서 rFlag값을 !rFlag로 바꿔주었다. 마지막에 출력할 때 rFlag가 True일 경우 뒤집어서 출력해주기만 하면 된다.
시간초과를 해결하니 채점은 되는데, 계속 50%에서 틀리는 것이다. 그래서 구글링을 했는데 이 문제의 FAQ가 있었다~ 나같이 틀린 사람이 많은 것 같았다. 확인해보니 내가 실수한 이유가 딱 나와있었다.
- 진짜로 배열의 모든 원소를 뒤집으면 안된다.
- 배열의 맨 앞 원소를 무작정 지워서는 안된다. (나는 덱 사용)
- 빈 배열은 []로 출력해야한다.
- 배열이 비어있을 때 R을 하는 건 에러가 아니다. D만 에러다.
- 테스트 케이스마다 초기화가 잘 됐는지 확인해라. 개행문자를 항상 출력하는지도.
...
틀렸던 코드를 보자
def solve(ops, s):
sList = s.split(',')
if not sList[0]:
ans.append('error')
return
...
나는 solve()
의 매개변수인 s
에, 입력 문자열의 '['와 ']'를 제거해서 넣어주었는데, '[]'가 입력으로 들어온 경우, s
가 빈문자열이 되므로 sList는 ['']
가 된다.
이 상태에서 D연산을 하면 당연히 에러지만, R연산만 일어날 수도 있기 때문에 무작정 에러로 처리하면 안되는 것이었다😱
그래서 저 부분을 다음과 같이 고쳐주었다. 비어있는 배열이 입력으로 들어온 경우, 실제로 sList를 비워줘야 원하는 연산이 일어나므로
def solve(ops, s):
sList = s.split(',')
if not sList[0]:
sList = []
arr = deque(sList)
...
빈문자열을 원소로 가지고 있었던 sList를 비워줬다. 그리고 그 후에 연산을 수행.
정답 코드 🙏🏻
from _collections import deque
T = int(input())
ans = []
def solve(ops, s):
sList = s.split(',')
if not sList[0]:
sList = []
arr = deque(sList)
rFlag = False
for op in ops:
if op == 'R':
rFlag = not rFlag
else: # 'D'일 때
if len(arr) == 0:
ans.append('error')
return
if rFlag: # 거꾸로일 때
arr.pop()
else:
arr.popleft()
if len(arr) == 0:
ans.append('[]')
return
if rFlag:
ans.append('['+','.join(list(reversed(arr)))+']')
else:
ans.append('['+','.join(arr)+']')
for _ in range(T):
ops = input()
input()
s = input()[1:-1]
solve(ops, s)
for r in ans:
print(r)