DolphinDash

백준 5397번: 키로거 (Python) 본문

PS/Solve

백준 5397번: 키로거 (Python)

DolphinDash 2023. 4. 6. 01:18
 

5397번: 키로거

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

www.acmicpc.net

접근 방식에 대해 고민을 하게 만드는 문제.

열심히 그렸어요.

Deque! (덱! 덱이라고! 덱!) 우린 파이썬을 사용하니 문제에 따라 효율적인 방식을 선택할 수 있다. 

 

(좌) 덱 (우) 리스트의 시간복잡도 / jpg불-편

커서를 움직인다고 생각하더라도 pop(0)일 경우 시간복잡도가 O(n)이기때문에 시간초과가 될 수 있다. 

그러므로 우리는 deque로 2개의 큐에다가 나눠 움직이는것처럼 만들어주면 된다.

여기서 deque 2개를 생성하고 문자열에 맞게 함수를 실행해도 되지만 Cursor라는 클래스가 있다고 생각하고 만들면 좀 더 보기에도 멋있고 이해하기도 더 쉬운 코드가 된다.

import sys
sys.stdin.readline
from collections import deque

class Cursor:
    def __init__(self) -> None:
        self.left = deque([])
        self.right = deque([])
    def put_string(self, option: str):
        try:
            if option == '<': self.right.appendleft(self.left.pop())
            elif option == '>': self.left.append(self.right.popleft())
            elif option == '-': self.left.pop() 
            else: self.left.append(option)
        except:
            pass

    def make_pair(self) -> str:
        return ''.join(self.left + self.right)
    
n = int(input())
for _ in range(n):
    c = Cursor()
    string = input().rstrip()
    for i in string:
        c.put_string(i)
    print(c.make_pair())

이 코드엔 또다른 디테일이 숨겨져있는데,

        try:
            if option == '<': self.right.appendleft(self.left.pop())
            elif option == '>': self.left.append(self.right.popleft())
            elif option == '-': self.left.pop() 
            else: self.left.append(option)
        except:
            pass

try-except 디테일무엇;; 이 코드를 보고 감격스러웠다. 어쩔 수 없이 코뽕이 와서 새벽이라도 이 글을 쓸 수 밖에 없었다. 

내가 썼다기엔 너무 멋진 코드가 되었다. 멋있는 코드가 내 머리 속에 와서 깊게 박히는 느낌. 정말 감사하다.

멋진 강의로 인해 알게된 문제인데 동기부여가 많이 된다. 감사합니다 민재사마. 이 게시물의 영광을 그에게.