알고리즘(algo)/백준

[백준] 1406번 - 에디터

dDong2 2023. 2. 5. 11:20
참고: https://www.acmicpc.net/problem/1406

 

✔️ 문제

 

 

문제는 다음과 같다.

 

 

✔️ 풀이

 

 

문제는 노트에 써가면서 이해할 수 있었다.

 

1) 커서는 맨 뒤에부터 존재한다.

2) L은 커서를 왼쪽으로(-1) 한칸 옮긴다.

3) D는 커서를 오른쪽으로(+1) 한칸 옮긴다.

4) B는 왼쪽 문자를 삭제(pop)한다.

5) P는 $ 문자를 왼쪽에 추가한다.

 

처음에 이 순서대로 코드를 구성해보았다.

 

import sys
input = sys.stdin.readline

text = list(input().rstrip())
n = int(input())
command = []

for _ in range(n):
    cmd = input().rstrip()
    if 'P' in cmd:
        command.append(list(cmd.split(' ')))
    else: command.append(cmd)

L=len(text)
for i in range(len(command)):
    if L < 0:
        L = 0
    if command[i] == 'L':
        L -= 1
    elif command[i] == 'D':
        L += 1
    elif command[i] == 'B':
        if L-1 >= 0: 
            del text[L-1]
            L -= 1
    else: 
        text.insert(L, command[i][1])
        L+=1

print(*text, sep='')

 

예제는 맞게 출력이 되지만 시간초과가 뜬다.

아마 append하는 부분과 len을 더했다 뺐다하는 부분 때문이라고

생각이 들었다.

 

import sys
input = sys.stdin.readline

text = list(input().rstrip())
n = int(input())

new_text = []
for _ in range(n):
    command = list(input().split())
    if command[0] == 'L':
        if text: new_text.append(text.pop())
    elif command[0] == 'D':
        if new_text: text.append(new_text.pop())
    elif command[0] == 'B':
        if text: text.pop()
    else: text.append(command[1])

text.extend(reversed(new_text))
print(''.join(text))

 

오랜 시간 고민한 끝에

다른 글과 질문을 참고한 결과 해당 코드와 같은

명쾌한 해답이 존재했는데,

 

1) 명령어가 L이면서 text가 있다면,

새 배열(스택)에 text의 마지막 원소를 빼면서 추가한다.

2) 명령어가 D이면서 새 배열이 있다면,

새 배열의 마지막 원소를 빼면서 text에 추가한다.

3) 명령어가 B라면 그냥 text 원소를 뺀다.

4) 명령어가 P라면 인덱스 1번의 값을 text에 추가한다.

5) 마지막으로 새로운 배열(스택)을 뒤집어 준 후,

기존 배열(스택)과 병합하는 과정 및 문자열 출력을 한다.

 

원래 문자의 리스트와 명령어 리스트를 활용할 생각만 했지,

append와 pop을 이용해서 두 개의 스택으로 쪼갤 생각은

해보지 못했다. 더 많은 문제와 풀이를 접해야겠다는 생각이 든다.

 

화이팅 💪