Problem Solving/Online Judge
[BOJ] #5397 - 키로거
se0m
2021. 6. 13. 01:53
5397번: 키로거
첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한줄로 이루어져 있고, 강산이가 입력한 순서대로 길이가 L인 문자열이 주어진다. (1 ≤ L의 길이 ≤ 1,000,000) 강산이가 백스페이
www.acmicpc.net
** 문제 유형
- 스택, 구현, 그리디
** 풀이
문자열의 크기가 최대 1,000,000이므로, 문제에서 요구하는 대로 구현하게 되면 문제를 해결할 수 없음
따라서 스택을 활용하여, 선형시간 안에 문제를 해결해야 함
- 2개 만들고, 스택 2개의 중간 지점을 커서(cursor)로 간주
- 문자 입력시, 왼쪽 스택에 원소를 삽입
- '-' 입력시, 왼쪽 스택에서 원소를 삭제
- '<' 입력시, 왼쪽 스택에서 오른쪽 스택으로 원소 이동
- '>' 입력시, 오른쪽 스택에서 왼쪽 스택으로 원소 이동
- 출력시, 오른쪽 스택을 뒤집어서 출력
test_case = int(input())
for _ in range(test_case):
data = input()
left_stack = []
right_stack = []
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))