https://www.acmicpc.net/problem/5397
키보드로 비밀번호를 입력하는데, 다음과 같은 특수 키가 존재한다:
<
: 커서를 왼쪽으로 한 칸 이동 (커서가 가장 앞이면 무시)
>
: 커서를 오른쪽으로 한 칸 이동 (커서가 가장 뒤면 무시)
-
: 커서 왼쪽의 문자 삭제 (삭제할 문자가 없으면 무시)
그 외의 문자(알파벳, 숫자): 커서 위치에 문자 삽입
문자열의 변화를 커서 이동과 함께 시뮬레이션한 후, 최종 비밀번호를 출력하는 문제다.
커서 기준으로 문자열을 왼쪽 스택(left)과 오른쪽 스택(right)으로 나눠 관리하면 커서 이동을 쉽게 구현할 수 있다.
문자를 입력하면 left에 append
<
이면 left에서 pop해서 right로 이동
>
이면 right에서 pop해서 left로 이동
-
이면 left에서 pop
마지막에 left + reversed(right)
로 문자열 완성
n = int(input())
def getPassword(text):
left = []
right = []
for t in text:
if t == "<":
if left:
right.append(left.pop())
elif t == ">":
if right:
left.append(right.pop())
elif t == "-":
if left:
left.pop()
else:
left.append(t)
password = ''.join(left) + ''.join(reversed(right))
return password
for i in range(n):
text = input()
password = getPassword(text)
print(password)
- 문자열 커서 이동 문제는 스택 두 개로 깔끔하게 해결할 수 있다.
reversed()
를 이용해 오른쪽 스택을 마지막에 뒤집는 것이 핵심!
이전문제를 풀면서 커서 이동에는 스택 2개를 사용하면 된다는걸 알고있었기에 쉽게 떠올릴수있었다. 하지만, 오른쪽 스택을 뒤집는것까지는 생각하지못한것이 함정...
else:
가 아닌 elif t.isalpha()
로 제한하면 숫자나 특수문자가 입력될 경우 누락되므로 else:로 처리하는 것이 좋다.문제에서 "키보드로 입력한 키는 알파벳 대문자, 소문자, 숫자, 백스페이스, 화살표이다."라고 했으므로 알파벳 외에 숫자도 입력가능한것을 간과하고있었다.
📚 Stack 사용법