코테/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)
미친 풀이다 엄청 깔끔하게 풀었다.
커서관련한 문제는 다음에 만난다면 저렇게 접근해봐야겠다.
반응형