반응형
문제설명
https://www.acmicpc.net/problem/1406
사고과정
- 처음에 전형적으로 커서를 인덱싱으로 나타낸 후, 명령어가 들어올 때마다 파이썬 문법 중 del list[index] 또는 list.insert(index, value) 를 사용했지만 시간초과 에러가 발생했다.
- 그래서 구글링해보니 2개의 스택을 활용하는 것이 핵심 아이디어 였다. 최초에 커서가 가장 오른쪽이니 오른쪽 용 스택은 비어놓고 주어진 문자열을 모두 왼쪽 스택에 담아놓는다. 그리고 왼쪽으로 이동하게 되면 왼쪽 스택에서 pop한 값(pop하게 되면 스택의 마지막 값을 빼온다 FILO 이기 떄문에)을 오른쪽 스택에 append 하면된다. 반대로 오른쪽으로 이동하게 되면 오른쪽 스택에서 pop한 값을 왼쪽 스택으로 append 한다. 중간 중간 오른쪽, 왼쪽 스택 중 하나가 비어있을 때는 그냥 continue 시키면서 주어진 조건을 만족하게 구현하면 된다.
- 마지막으로 오른쪽 스택을 이어붙일 때는 원소 값을 reverse 해주어야 하는 것도 잊지 말자!
풀이(스스로 못 푼 풀이)
import sys
input = sys.stdin.readline
left_stack = list(input().rstrip())
right_stack = []
m = int(input())
for _ in range(m):
order = input().split()
if order[0] == 'L':
if len(left_stack) == 0:
continue
else:
right_stack.append(left_stack.pop())
if order[0] == 'D':
if len(right_stack) == 0:
continue
else:
left_stack.append(right_stack.pop())
if order[0] == 'B':
if len(left_stack) == 0:
continue
else:
left_stack.pop()
if order[0] == 'P':
left_stack.append(order[1])
result = left_stack + right_stack[::-1]
print(''.join(result))
다시 한 번 풀어본 풀이(어차피 if - continue문으로 빠져나가기 때문에 else 구문 없어도 되도록 함)
import sys
input = sys.stdin.readline
left = list(input().rstrip())
right = []
m = int(input())
for _ in range(m):
order = input().split()
if order[0] == 'P':
left.append(order[1])
if order[0] == 'L':
# 문장 맨 앞인 경우
if len(left) == 0:
continue
right.append(left.pop())
if order[0] == 'D':
# 문장 맨 뒤인 경우
if len(right) == 0:
continue
left.append(right.pop())
if order[0] == 'B':
# 문장 맨 앞 인 경우
if len(left) == 0:
continue
left.pop()
print(''.join(left + right[::-1]))
반응형
'알고리즘 삽질장' 카테고리의 다른 글
[BOJ] 1158번 - 요세푸스 문제 (0) | 2021.10.24 |
---|---|
[BOJ] 10845번 - 큐 (0) | 2021.10.24 |
[BOJ] 1874번 - 스택 수열 (0) | 2021.10.23 |
[BOJ] 9012번 - 괄호 (0) | 2021.10.23 |
[BOJ] 9093번 - 단어 뒤집기 (0) | 2021.10.23 |