Algorithm/BOJ

Algorithm) BOJ) 백준 1406 - 에디터

삼쓰 웅쓰 2019. 5. 21. 18:16
728x90

문제보러가기

 

1406번: 에디터

문제 한 줄로 된 간단한 에디터를 구현하려고 한다. 이 편집기는 영어 소문자만을 기록할 수 있는 편집기로, 최대 600,000글자까지 입력할 수 있다. 이 편집기에는 '커서'라는 것이 있는데, 커서는 문장의 맨 앞(첫 번째 문자의 왼쪽), 문장의 맨 뒤(마지막 문자의 오른쪽), 또는 문장 중간 임의의 곳(모든 연속된 두 문자 사이)에 위치할 수 있다. 즉 길이가 L인 문자열이 현재 편집기에 입력되어 있으면, 커서가 위치할 수 있는 곳은 L+1가지 경우가

www.acmicpc.net

 

문제를 보고 가장 먼저 한 생각은 배열로 만들어 풀면 되겠다 라고 생각했었지만

그렇게 하면 삽입, 삭제를 할 때 커서 뒤의 모든 원소를 옮겨야 하기 때문에 시간 제한에 걸리게 됩니다!

커서를 기준으로 왼쪽, 오른쪽 2개의 스택을 만들어 push, pop해주는 방법을 사용하였습니다 :ㅇ

 

커서를 왼쪽으로 한 칸 옮긴다건 왼쪽 스택에서 빼서 오른쪽 스택에 옮긴다는 의미가 되겠죠!!

 

Swift 코드

 

var stackL = Array(readLine()!)
var stackR = [Character]()

for _ in 0..<Int(readLine()!)! {
    let order = readLine()!
    switch order {
    case "L":
        if !stackL.isEmpty {
            stackR.append(stackL.removeLast())
        }
    case "D":
        if !stackR.isEmpty {
            stackL.append(stackR.removeLast())
        }
    case "B":
        if !stackL.isEmpty {
            stackL.removeLast()
        }
    default:
        stackL.append(order.last!)
    }
}

print(String(stackL + stackR.reversed()))

 

아래 풀이는 재채점 되면서 시간초과가 되었습니다. 

if let str = readLine() {
    let n = readLine().map{Int($0)!}!

    var stackL = str
    var stackR = ""
    
    for _ in 0..<n {
        var order = readLine()
        switch order {
        case "L":
            if stackL != "" {
                let c = stackL.removeLast()
                stackR.append(c)
            }
        case "D":
            if stackR != "" {
                let c = stackR.removeLast()
                stackL.append(c)
            } 
        case "B":
            if stackL != "" {
                stackL.removeLast()
            }
        default:
            let p = order!.removeLast()
            stackL.append(p)
        }
    }
    
    print(stackL + stackR.reversed())
    
}