알고리즘

[백준, 파이썬, 1406번] 에디터

hminor 2024. 4. 23. 12:19

풀이

  • 처음 접근한 방식은 그래도 최대한 계산을 덜하도록 하기 위해
  • 인덱스와 길이를 계산하면서 조건 분기후 처리하려 했지만
  • 역시나 시간초과가 발생하여 
  • 아래에 있던 힌트에 스택을 활용하여 해결
  • 좌우에 각각의 배열을 만들어 해결했는데
  • 우선 초기 문자열을 좌측 l 배열에 넣고 
  • L문자가 주어지면 l배열의 가장 마지막 값을 r배열 가장 왼쪽에 추가하고
  • D는 l배열 가장 마지막 문자를 지우는 형식으로 B와 P 또한 각 조건 분기에 맞게 처리하여
  • 마지막엔 각각의 배열을 합쳐 출력하여 해결
  • 여기서 deque는 간단하게 배열 좌우에서 추가 제거가 가능하도록 하기 위해 사용
  • 첫 번째 풀이가 정답 코드이며, 두 번째 풀이가 시간 초과 코드

 

첫 번째 풀이(정답)

import sys
from collections import deque
input = sys.stdin.readline

l,r = deque(list(input().rstrip('\n'))),deque([])
for _ in range(int(input())):
    li = input().rstrip('\n').split()
    if li[0] == 'L' and len(l): r.appendleft(l.pop())
    elif li[0] == 'D' and len(r): l.append(r.popleft())
    elif li[0] == 'B' and len(l): l.pop()
    elif li[0] == 'P': l.append(li[1])
print(''.join(l+r))

 

두 번째 풀이(시간 초과)

import sys
from collections import deque
input = sys.stdin.readline

s = list(input().rstrip('\n'))+['']
idx = len(s)-1
ln = idx
for _ in range(int(input())):
    li = input().rstrip('\n').split()
    if li[0] == 'L' and idx > 0: idx -= 1
    elif li[0] == 'D' and idx < ln: idx += 1
    elif li[0] == 'B' and idx > 0:
        s.pop(idx-1)
        idx -= 1
        ln -= 1
    elif li[0] == 'P':
        s.insert(idx,li[1])
        idx += 1
        ln += 1
print(''.join(s))

 

'알고리즘' 카테고리의 다른 글

[백준, 파이썬, 5014번] 스타트링크  (0) 2024.05.02
[백준, 파이썬, 2644번] 촌수계산  (0) 2024.05.01
[백준, 파이썬, 10867번] 중복 빼고 정렬하기  (0) 2024.04.23
[파이썬] numpy  (0) 2024.04.05
벡터 vector  (0) 2024.04.04