백준: 5397번 - 키로거 swift

pengsang·2023년 8월 15일

문제풀이

목록 보기
1/11
post-thumbnail

문제 예시

1. 입력

2
<<BP<A>>Cd-
ThIsIsS3Cr3t

2. 출력

BAPC
ThIsIsS3Cr3t

규칙

  1. "<" 와 ">"는 키보드의 커서를 이동시키는 역할을 한다
  2. "-"는 바로 앞 문자를 없애는 역할을 한다
  3. 1과 2외의 문자를 제외한 나머지 문자와 숫자는 입력받으면 그대로 키로그에 기록된다

풀이

  1. 배열 내에서 insert(newElement:, at:)를 이용해 풀이를 하려했으나 시간초과가 발생
    -> 따라서 문자열 처리를 위한 스택 2개를 이용하기로 결정

  2. 스택 2개는 각각 키로그를 기록할 공간, "<", ">", "-"를 확인한 경우 해당 역할에 맞게 문자를 이동시키기 위한 예비 버퍼의 역할을 한다

    a. 스택1에는 키로그를 기록한다
    b. 만약 "<"를 확인한 경우 커서를 왼쪽으로 이동시키게 되므로 스택1의 키로그 중 마지막 문자를 스택 2로 이동시킨다
    c. 만약 ">"를 확인한 경우 커서를 오른쪽으로 이동시키게 되므로 스택 2의 문자를 스택 1로 이동시킨다
    d. 만약 "-"를 확인한 경우 키로그의 문자를 하나 없애고 커서를 왼쪽으로 하나 이동시킨다

  3. 스택2에 남아있는 문자가 있으면 전부 스택1로 옮기고 마지막에 joined()를 하여 출력한다


코드

import Foundation

let input = Int(readLine()!)!

for _ in 0..<input {
    let a = readLine()!
    
    var stack1 = [String]()
    var stack2 = [String]()
    
    for i in a {
        if i == "<", !stack1.isEmpty {
            stack2.append(stack1.removeLast())
        } else if i == ">", !stack2.isEmpty {
            stack1.append(stack2.removeLast())
        } else if i == "-", !stack1.isEmpty {
            stack1.removeLast()
        } else if i != "<" && i != ">" && i != "-" {
            stack1.append(String(i))
        }
    }
    while !stack2.isEmpty {
        stack1.append(stack2.removeLast())
    }
    
    print(stack1.joined())
}

profile
내 꿈은 고등어

0개의 댓글