참고: 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을 이용해서 두 개의 스택으로 쪼갤 생각은
해보지 못했다. 더 많은 문제와 풀이를 접해야겠다는 생각이 든다.
화이팅 💪
'알고리즘(algo) > 백준' 카테고리의 다른 글
[백준] 1920번 - 수 찾기 (0) | 2023.02.06 |
---|---|
[백준] 5585번 - 거스름돈 (0) | 2023.02.06 |
[백준] 1874번 - 스택 수열 (0) | 2023.02.05 |
[백준] 9012번 - 괄호 (0) | 2023.02.04 |
[백준] 9093번 - 단어 뒤집기 (0) | 2023.02.04 |