공부하자!/알고리즘
백준 1406 에디터 파이썬
지우개원정대
2021. 8. 3. 23:11
문제 풀이
첫 번째 시도
for _ in range(M):
t = list(map(str, sys.stdin.readline()))
if t[0] == 'L' and cursor != 0:
cursor -= 1
elif t[0] == 'D' and cursor != len(N):
cursor += 1
elif t[0] == 'B' and cursor != 0:
del N[cursor - 1]
cursor -= 1
elif t[0] == 'P':
N.insert(cursor, t[2])
cursor += 1
시간 초과가 나왔다.
insert와 del을 썼는데, 시간복잡도가 O(n)이어서 그런 것 같았다.
두 번째 시도
시간복잡도 O(1)인 append, pop을 써서 다시 시도!
커서를 옮길 때 cursor 변수를 옮기는 게 아니라,
왼쪽 스택, 오른쪽 스택을 나눠서 커서가 옮겨질 때마다 스택에서 pop, append를 하는 것이다.
예를 들어, 커서를 왼쪽으로 한 칸 옮긴다면 왼쪽 스택에서 pop하고 그 문자를 오른쪽 스택에 append 한다. 커서를 오른쪽으로 옮긴다면 반대로 하면 된다.
import sys
N = list(map(str, sys.stdin.readline().rstrip()))
N2 = []
M = int(sys.stdin.readline())
for _ in range(M):
t = sys.stdin.readline().rstrip()
if t[0] == 'L' and N:
N2.append(N.pop())
elif t[0] == 'D' and N2:
N.append(N2.pop())
elif t[0] == 'B' and N:
N.pop()
elif t[0] == 'P':
N.append(t[2])
N2.reverse()
print(''.join(i for i in N), end='')
print(''.join(i for i in N2))