백준 1406 에디터 파이썬

이윤진·2023년 10월 5일
0

알고리즘 연습

목록 보기
14/24

문제 링크

그냥 커서 생각해서 옮기면 되는 문제라 쉽게 생각했다.
시간 제한이 0.3초인게 마음에 걸렸지만 애초에 계산 자체가 크게 많지 않아서 괜찮을 거라 생각했다..
그러나 역시나 시간 제한에 의해 시간 초과가 났다.

정답이 제대로 나오긴 하는데...
일단 내가 처음에 작성한 코드는 아래와 같다.

# 에디터

import sys

st = list(sys.stdin.readline().rstrip())
num = int(sys.stdin.readline().rstrip())

curser = len(st)

for i in range(num):
    oper = list(sys.stdin.readline().rstrip())
    if oper[0] == 'L':
        if curser > 0:
            curser -= 1
    elif oper[0] == 'D':
        if curser < len(st):
            curser += 1
    elif oper[0] == 'B':
        if curser > 0 :
            st.pop(curser-1)
            curser -= 1
    elif oper[0] == 'P':
        st.insert(curser, oper[2])
        curser += 1

print(st)

문제 방식과 똑같이 커서를 옮기면서 풀었다.
그러나 아무래도 insert의 시간 복잡도가 크기 때문에 문제가 생긴 것 같다.

insert를 쓰지 않으려면 append만을 사용해서 해야 하는데 index 위치에 값을 집어넣을 방법이 잘 생각나지 않았다.

인터넷에서 다른 사람의 풀이를 보니, 왼쪽, 오른쪽 리스트를 나눠서 이를 해결하였다.
아래는 해당 솔루션을 보고 내가 따로 작성한 코드이다.

#에디터

import sys

left = list(sys.stdin.readline().rstrip())
num = int(sys.stdin.readline().rstrip())
right = []

for i in range(num):
    oper = list(sys.stdin.readline().rstrip())
    if oper[0] == 'L' and left:
        right.append(left.pop())
    elif oper[0] == 'D' and right:
        left.append(right.pop())
    elif oper[0] == 'B' and left:
        left.pop()
    elif oper[0] == 'P':
        left.append(oper[2])

print("".join(left + list(reversed(right))))

정말 어쩜 이런 생각을 하는지...
스바라시이~~

처음엔 왼쪽 오른쪽 나눈다고..?
하면서 이해가 잘 안 되었는데
커서를 가만히 두고, 왼쪽 오른쪽의 문자를 옮긴다고 생각하니까 바로 이해가 되었다.

나도 꾸준히 열심히 해서 이런 코드도 금방금방 생각해낼 수 있는 사람이 되고 싶다.

profile
Android/Flutter 개발

0개의 댓글