동캄의 코딩도장

백준 5397 [키로거] 파이썬 본문

코테/BOJ

백준 5397 [키로거] 파이썬

동 캄 2025. 2. 13. 22:54
반응형

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

연결리스트로 풀어야겠다고 생각은 했으나, 너무 어려웠다.

범부다 나는 범부

 

C언어 처럼 리스트를 통해 연결하려 했으나 시간초과가 발생하였고, 결국 풀이를 보았다.

 

나의 풀이

# 백준 5397 키로거
import sys
N=int(sys.stdin.readline())
for _ in range(N):
    cmds=list(map(str,sys.stdin.readline().rstrip()))
    prev_word=-1
    next_word=1
    curr_word=-1
    words={}
    words[prev_word]=[-2,1]
    words[next_word]=[-1,2]
    i=0
    for cmd in cmds:
        if cmd =='<':
            if curr_word!=-1:
                next_word=curr_word
                curr_word=words[next_word][0]
                prev_word=words[curr_word][0]
        elif cmd =='>':
            if words[curr_word][1]!=1:
                prev_word=curr_word
                curr_word=words[prev_word][1]
                next_word=words[curr_word][1]
        elif cmd == '-':
            if curr_word!=-1:
                words[prev_word][1]=next_word
                words[next_word][0]=prev_word
                curr_word=prev_word
                prev_word=words[curr_word][0]
        else:
            cmd=cmd+str(i)
            prev_word=curr_word #현재 word가 prev_word가 됨
            curr_word=cmd # 새로운 word가 curr_word가 됨
            words[prev_word][1]=curr_word  # 이전 word와 현재 word 연결
            words[curr_word]=[prev_word,next_word] #현재 word와 이전 word 연결
            words[next_word][0]=curr_word # 다음 word와 현재 word 연결
        i+=1
    element=words[-1][1]
    while True:
        if element!=1:
            print(element[0],end='')
            element=words[element][1]
        else:
            break
    print()

 

 

GPT가 제공한 풀이 

import sys

N = int(sys.stdin.readline())

for _ in range(N):
    cmds = sys.stdin.readline().rstrip()
    
    # 왼쪽, 오른쪽 스택으로 커서를 처리합니다.
    left_stack = []
    right_stack = []

    for cmd in cmds:
        if cmd == '<':
            if left_stack:
                # 왼쪽 스택에서 오른쪽 스택으로 이동
                right_stack.append(left_stack.pop())
        elif cmd == '>':
            if right_stack:
                # 오른쪽 스택에서 왼쪽 스택으로 이동
                left_stack.append(right_stack.pop())
        elif cmd == '-':
            if left_stack:
                # 왼쪽 스택에서 마지막 문자를 삭제
                left_stack.pop()
        else:
            # 문자를 왼쪽 스택에 추가
            left_stack.append(cmd)

    # 결과는 왼쪽 스택의 문자 + 오른쪽 스택의 반전된 문자들
    result = ''.join(left_stack) + ''.join(reversed(right_stack))
    print(result)

미친 풀이다 엄청 깔끔하게 풀었다.

 

커서관련한 문제는 다음에 만난다면 저렇게 접근해봐야겠다.

반응형