본문 바로가기

알고리즘 삽질장

[BOJ] 1406번 - 에디터

반응형


문제설명

https://www.acmicpc.net/problem/1406

 

1406번: 에디터

첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수

www.acmicpc.net

사고과정

  • 처음에 전형적으로 커서를 인덱싱으로 나타낸 후, 명령어가 들어올 때마다 파이썬 문법 중 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