본문 바로가기

BOJ 알고리즘 (패캠)/자료구조, 구현

5397번: 키로거 (구현, 스택) - Fastcampus

www.acmicpc.net/problem/5397

 

5397번: 키로거

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

www.acmicpc.net

# 배열로 풀면 시간초과 (배열의 insert 연산 때문에)
def run(string):
    pwd = []
    idx = 0  # 커서의 위치

    for ch in string:
        if ch == "<":
            idx = max(0, idx - 1)
        elif ch == ">":
            idx = min(len(pwd), idx + 1)
        elif ch == "-":
            if pwd:
                pwd.pop()
                idx -= 1
        else:
            pwd.insert(idx, ch)
            idx += 1

    return pwd


# [KP] 커서 기준으로 2개 스택으로 구현하면 insert 연산을 피할수 있다
def run(string):
    lst, rst = [], []  # 스택 2개

    for ch in string:
        if ch == "<":
            if lst:
                rst.append(lst.pop())
        elif ch == ">":
            if rst:
                lst.append(rst.pop())
        elif ch == "-":
            if lst:
                lst.pop()
        else:
            lst.append(ch)

    pw = lst + list(reversed(rst))
    return pw


T = int(input())
for _ in range(T):
    string = input()
    ans = run(string)
    print("".join(ans))