5397번 키로거
풀이 방법
- 입력된 문자열을 한글자씩 for문을 돌면서
- 커서를 기준으로 좌, 우 스택에 넣는다(커서를 움직이는게 아니라 데이터를 옮기는 것)
- "<"(">")일 때, 왼쪽(오른쪽)의 스택에 데이터가 있으면 pop해서 오른쪽(왼쪽)에 append
- "-"일 때, 왼쪽 스택에서 pop
- 그냥 문자면 왼쪽에 append한다
- 마지막에 합칠 때, 오른쪽의 배열을 반대로 뒤집어야함
- ex)
"<<BP<A>>Cd-"
-
data | left_stack | cursor | right_stack |
---|
"<" | left에 데이터가 없으므로 pass | | | - |
"<" | left에 데이터가 없으므로 pass | | | - |
"B" | B | | | - |
"P" | BP | | | - |
"<" | B | | | P |
"A" | BA | | | P |
">" | BAP | | | - |
">" | BAP | | | right에 데이터가 없으므로 pass |
"C" | BAPC | | | - |
"d" | BAPCd | | | - |
"-" | BAPC | | | - |
풀이
Python
test_case = int(input())
for _ in range(test_case):
user_input = input()
left_stack, right_stack = list(), list()
for i in user_input:
if i == "<":
if left_stack:
left_popped = left_stack.pop()
right_stack.append(left_popped)
elif i == ">":
if right_stack:
right_popped = right_stack.pop()
left_stack.append(right_popped)
elif i == "-":
if left_stack:
left_stack.pop()
else:
left_stack.append(i)
left_stack.extend(reversed(right_stack))
print("".join(left_stack))
Swift
let testCase = Int(readLine()!)!
for _ in 1...testCase {
let userInput = readLine()!
var leftStack: [String] = []
var rightStack: [String] = []
for i in userInput {
if i == "<" {
if leftStack.isEmpty == false {
let poppedLeftStack = leftStack.popLast()!
rightStack.append(poppedLeftStack)
}
} else if i == ">" {
if rightStack.isEmpty == false {
let poppedRightStack = rightStack.popLast()!
leftStack.append(poppedRightStack)
}
} else if i == "-" {
if leftStack.isEmpty == false {
leftStack.popLast()
}
} else {
leftStack.append(String(i))
}
}
rightStack.reverse()
leftStack.append(contentsOf: rightStack)
print(leftStack.joined(separator: ""))
}