📝 Study Notes/Baekjoon
1406 에디터 (Python)
lazyArtisan
2024. 10. 8. 10:49
문제 : https://www.acmicpc.net/problem/1406
import sys
input = sys.stdin.readline
class Node():
def __init__(self,s,p,n):
self.string = s
self.prev = p
self.next = n
def delete(self):
if self.prev:
self.prev.next = self.next
if self.next:
self.next.prev = self.prev
def addLeft(self,s):
new_node = Node(s,self.prev,self)
if self.prev:
self.prev.next = new_node
self.prev = new_node
init_str = input().strip()
M = int(input())
prev = None
for s in init_str:
node = Node(s, prev, None) # 새 노드 만들고
if prev:
prev.next = node # 이전 노드에 연결
prev = node # 이전 노드를 이번 노드로 만들기
# 커서를 노드 왼쪽에 두기 위해 마지막 배열 추가.
endNode = Node(None,node,None)
node.next = endNode
node = endNode
# 커서는 노드의 왼쪽에 있는 것으로 간주
for _ in range(M):
oper = input().strip()
if oper[0] == 'P':
p, alp = oper.split()
node.addLeft(alp) # alp를 커서 왼쪽(현재 노드 왼쪽)에 추가함
elif oper == 'L':
# 커서를 왼쪽으로 한 칸 옮김
if node.prev:
node = node.prev
elif oper == 'D':
# 커서를 오른쪽으로 한 칸 옮김
if node.next:
node = node.next
elif oper == 'B':
# 커서 왼쪽에 있는 문자(현재 노드의 이전 노드)를 삭제함
if node.prev:
node.prev.delete()
while node.prev != None: # == 으로 적은 실수
node = node.prev
while node.string != None:
print(node.string, end='')
node = node.next
풀긴 했는데 시간이 너무 느림
from sys import stdin
left = list(input())
right = []
for _ in range(int(input())):
command = list(stdin.readline().split())
if command[0] == 'L' and left:
right.append(left.pop())
elif command[0] == 'D' and right:
left.append(right.pop())
elif command[0] == 'B' and left:
left.pop()
elif command[0] == 'P':
left.append(command[1])
answer = left + right[::-1]
print(''.join(answer))
다른 사람 풀이 보니까 커서 왼쪽과 오른쪽을 나누고
커서를 옮기는 건
커서 왼쪽을 나타내는 배열과
커서 오른쪽을 나타내는 배열의
한 쪽에서 빼낸 후에 다른 한 쪽에 더하는 식
아니 그러면 오른쪽은 append할 때 연산 비싼거 아닌가? 했는데
오른쪽 배열은 거꾸로 뒤집어놨다고 보면 됨
pop으로만 빼내므로 연산 비싸지 않다.