문제
코드
My answer
from collections import deque
T = int(input())
for _ in range(T):
L = input()
left = deque()
right = deque()
for i in L:
if(i=="<"):
if(len(left)!=0):
right.appendleft(left.pop())
elif(i==">"):
if(len(right)!=0):
left.append(right.popleft())
elif(i=="-"):
if(len(left)!=0):
left.pop()
else:
left.append(i)
print(''.join(left+right))
import sys
input=sys.stdin.readline
t_c=int(input())
for _ in range(t_c):
log=input().rstrip()
answer,tmp=[],[]
for i in log:
answer.append(i)
if(answer[-1] in ['>','<','-']):
now=answer.pop()
if(now=='<'):
if(answer==[]):continue
tmp.append(answer.pop())
elif(now=='>'):
if(tmp==[]):continue
answer.append(tmp.pop())
else:
if(answer==[]):continue
answer.pop()
while(tmp!=[]):answer.append(tmp.pop())
answer="".join(answer)
print(answer)
Another answer
from collections import deque
T = int(input())
for _ in range(T):
L = input()
left = deque()
right = deque()
for i in L:
if(i=="<"):
if(len(left)!=0):
right.appendleft(left.pop())
elif(i==">"):
if(len(right)!=0):
left.append(right.popleft())
elif(i=="-"):
if(len(left)!=0):
left.pop()
else:
left.append(i)
print(''.join(left+right))
풀이
my answer 첫번째 방법의 경우에는 스택2개를 이용하여 구현하였다. 우선 방향키가 갈 수 있는지 없는지를 판단하고,
왼쪽 방향키가 나올 경우, 중간에 삽입하여 입력해야하기 때문에 우선 왼쪽의 마지막껄 오른쪽 스택으로 넘겨주고,
오른쪽 방향키가 나올경우 오른쪽 스택에 저장해뒀던걸 다시 왼쪽으로 옮겨주고
백스페이스가 나올경우 왼쪽에서 하나 지워줬다,
최종적으로 오른쪽에 남아있는 것들을 모두 왼쪽으로 옮겨줬다.
두 번째 방법은 두개의 큐로 구현을 하였다. 아이디어는 위와 동일하고, popleft와 appendleft를 이용하기 위하여 큐를 사용하여 구현하였다.
아이디어는 "ab<ce>df-" 라는 로그가 주어졌다고 할 때,
우선 ab는 바로 스택에 들어가고, 왼쪽 방향키가 나왔으므로, a와 b사이에 다음 문자들을 기록해야 하기 때문에 b를 오른쪽 스태겡 넣어준다.
현재 방향키는 a뒤에 있으므로, ce를 그대로 입력하고( 현재 ace 왼쪽/ b 오른쪽) 이번엔 오른쪽 키가 나왔으므로, 오른쪽 스택에 있던 b를 복귀시켜준다. (삽입이 마무리 되었다는 의미) 최종적으로 d와 f를 입력하고 -가 한번 들어오기 때문에 정답은 acebd가 될 것이다.
조건들만 잘 살펴주면 쉽게 해결할 수 있을 것 같다.
728x90
반응형
'코딩테스트 > 백준[Python]' 카테고리의 다른 글
[Python] 백준 #1302 - 베스트셀러 (0) | 2022.03.01 |
---|---|
[Python] 백준 #11729 - 최대 힙 (0) | 2022.02.28 |
[Python] 백준 #1021- 회전하는 큐 (0) | 2022.01.23 |
[Python] 백준 #1966- 프린터 큐 (0) | 2022.01.23 |
[Python] 백준 #2776- 암기왕 (0) | 2022.01.23 |