반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- BFS
- python
- dfs
- 가상메모리 관리
- programmers
- 힙
- 파이썬
- level3
- 재귀
- 브루트포스
- 운영체제
- 가상메모리
- 스택
- BOJ
- level2
- 코딩테스트
- level0
- 다이나믹 프로그래밍
- 프로그래머스
- MYSQL
- 에라스토테네스의 체
- 백준
- 딕셔너리
- 구현
- DP
- 그리디
- 다익스트라
- level1
- N과M
- 수학
Archives
- Today
- Total
동캄의 코딩도장
백준 5397 [키로거] 파이썬 본문
반응형
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)
미친 풀이다 엄청 깔끔하게 풀었다.
커서관련한 문제는 다음에 만난다면 저렇게 접근해봐야겠다.
반응형
'코테 > BOJ' 카테고리의 다른 글
백준 10799 [쇠막대기] 파이썬 (0) | 2025.02.13 |
---|---|
백준 9012 [괄호] 파이썬 (0) | 2025.02.13 |
백준 1158 [요세푸스 문제] 파이썬 (0) | 2025.02.12 |
백준 3273 [두 수의 합] 파이썬 (0) | 2025.02.12 |
백준 14940 [쉬운 최단거리] 파이썬 (0) | 2025.02.04 |