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())
}