[Swift] 백준 1406 - 에디터

sun02·2021년 11월 6일
0

알고리즘

목록 보기
7/52

문제링크

두 개의 스택을 사용하여, 커서의 이동에 따라 원소를 왼쪽이나 오른쪽으로 옮겨주면 되는 문제이다.

예를들어, abc 가 있을 때 "L"명령어를 받는다면
커서가 왼쪽으로 이동해야하기 때문에 ab|c 와 같이 되고
이를 스택으로 표현한다면 왼쪽 스택에 a,b 오른쪽 스택에 c가 들어가야한다.

이를 popLast( 스택의 마지막 원소를 제거하고, 해당 원소를 반환함) 과 append(해당 스택의 제일 마지막에 원소 추가함)를 사용하여 구현하였다.

초기 코드(대충보세요...;;)


import Foundation

var letters = readLine()!
let testCase = Int(readLine()!)!
var rightLetters = [Characters]()

for _ in 0..<testCase {
    let line = readLine()!.split(separator: " ")

    if line[0] == "P" {
        letters.append(contentsOf: line[1])
    } else if line[0] == "L" {
        if letters.isEmpty == false {
         rightLetters.insert(letters.popLast()!, at: 0)
        }
    } else if line[0] == "D" {
        if rightLetters.isEmpty == false {
            letters.append(rightLetters.popLast()!)
        }
    } else if line[0] == "B" {
        if letters.isEmpty == false {
            letters.removeLast()
        }
    }
}

rightLetters.reversed()

letters.forEach {
    print($0,terminator: "")
}
rightLetters.forEach {
    print($0, terminator: "")
}
  • 시간 초과가 나서 성공인지 실패인지 조차 볼 수 없었다 ^^,,,
    검색을 통해 readLine().split이 시간을 많이 잡아먹는다는 것을 알게되었고 다음과 같이 수정하였다.

최종 제출 코드!

import Foundation

var letters = readLine()!
let testCase = Int(readLine()!)!
var rightLetters = ""

for _ in 0..<testCase {
    let line = readLine()!

    if line == "L" {
        if !letters.isEmpty {
            rightLetters.append(letters.popLast()!)
        }
    } else if line == "D" {
        if !rightLetters.isEmpty {
            letters.append(rightLetters.popLast()!)
        }
    } else if line == "B" {
        if !letters.isEmpty {
            letters.removeLast()
        }
    } else {
        letters.append(line.last!)
    }
}

print(letters + rightLetters.reversed())
  • split을 사용하지 못하기 때문에, "P $"를 else로 처리하였다.
  • String도 reversed()가 된다는걸 몰랐다.
    • string은 배열이니까 당연한건데.. 바보다ㅜ
  • letters.isEmpty == false 와 !letters.isEmpty 중 후자가 더 빠르다 시간이 4ms 나 줄었다..!

0개의 댓글