Koala - 12기/코딩테스트 준비 스터디

[백준/Python] 5397번 : 키로거

kwonlabong 2023. 10. 29. 16:05

문제

https://www.acmicpc.net/problem/5397

 

5397번: 키로거

첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한줄로 이루어져 있고, 강산이가 입력한 순서대로 길이가 L인 문자열이 주어진다. (1 ≤ L ≤ 1,000,000) 강산이가 백스페이스를 입

www.acmicpc.net


풀이

커서를 기준으로 왼쪽, 오른쪽을 나누어 저장하기 위해 deque를 생성한다. 
(왼쪽 deque | 오른쪽 deque)
입력받은 문자열을 for문으로 하나씩 확인한다.
- 왼쪽 deque이 비어있지 않고, '-'라면 왼쪽 deque를 pop 한다.
- 왼쪽 deque이 비어있지 않고, '<'라면 왼쪽 deque에서 pop 한 값을 오른쪽 deque에 appendleft 한다.
- 오른쪽 deque이 비어있지 않고, '>'라면 오른쪽 deque에서 popleft 한 값을 왼쪽 deque에 append 한다.
- 위의 조건에 해당하지 않으면 화살표나 '-'를 입력받아도
  문자가 없어 커서가 움직이지 않거나 지울 것이 없기 때문에 무시하고,
  그 외의 입력값들은 모두 비밀번호의 일부이므로 왼쪽 deque에 append 한다.

왼쪽 deque와 오른쪽 deque를 합쳐서 출력한다.


코드

from collections import deque
import sys
input = sys.stdin.readline

n = int(input())
for _ in range(n):
    s = input().rstrip()
    l = deque([])
    r = deque([])
    for i in s:
        if l and i == '-':
            l.pop()
        elif l and i == '<':
            r.appendleft(l.pop())
        elif r and i == '>':
            l.append(r.popleft())
        elif i != '<' and i != '>' and i != '-':
            l.append(i)

    print(''.join(l + r))