stack
list
stack
은 가장 나중에 들어온 자료가 가장 먼저 처리되는 LIFO 자료구조이다.list
를 사용하므로 stack
자료구조를 따로 제공하지 않는다.❌ 시간초과로 통과되지 못한 코드이다 😥
- 1개의 스택을 사용하여 현재의 커서(curr_index)를 통해 삽입, 삭제, 이동을 구현하였다.
- 커서가 문자열 중간에 있는 경우 모든 문자를 오른쪽으로 1칸씩 이동시키기 위해
insert(index, 문자)
를 이용하였다.insert(index, 요소)
는 리스트의 특정 index에 요소 하나를 추가한다.
n = int(input())
for i in range(n):
stack = []
curr_index = 0
write = input()
for ch in write:
if ch == "<":
if curr_index != 0:
curr_index -= 1
elif ch == ">":
if curr_index != len(stack) and len(stack) != 0:
curr_index += 1
elif ch == "-":
if len(stack) != 0 and curr_index != 0:
stack.pop(curr_index - 1)
curr_index -= 1
else:
stack.insert(curr_index, ch)
curr_index += 1
print("".join(stack))
stack.insert(curr_index, ch)
와 stack.pop(index)
때문에 시간초과가 발생한 게 아닐까 하는 생각이 든다.list.insert(index, 요소)
와 list.pop(index)
의 시간복잡도는 이라고 한다.-
의 경우 left_stack이 비어 있지 않은 경우 left_stack.pop()을 통해 현재 커서의 왼쪽의 값 1개를 삭제한다.<
의 커서를 왼쪽으로 한 칸 이동한다. 즉, 반대로 생각하면 커서 왼쪽의 값 1개를 오른쪽 스택으로 넘기면 된다.>
의 경우도 마찬가지로 커서 오른쪽 값 1개를 왼쪽 스택으로 넘기면 된다.test_case = int(input())
for _ in range(test_case):
left_stack = []
right_stack = []
data = input()
for i in data:
if i == "-":
if left_stack:
left_stack.pop()
elif i == "<":
if left_stack:
right_stack.append(left_stack.pop())
elif i == ">":
if right_stack:
left_stack.append(right_stack.pop())
else:
left_stack.append(i)
left_stack.extend(reversed(right_stack))
print("".join(left_stack))