Algorithm
[Swift] 6. 백준 1406번: 에디터
Wonni
2023. 2. 22. 01:11
시간제한의 어려움을 극한으로 느낄 수 있었던 문제......엉엉....
문제 링크
https://www.acmicpc.net/problem/1406
1406번: 에디터
첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수
www.acmicpc.net
풀이
초반엔 그냥 switch로 명령어 나눠서 배열의 index를 가지고 하나씩 옮겨주는 방식을 떠올렸다.
시간제한이 빡세길래 안될 것 같다는 직감은 들었지만 딱히 다른 방법이 생각나지 않아서 그냥 그대로 코드를 짰는데 역시나 시간초과...
고민하다가 결국 다른 분들의 코드를 보고 내 답을 고쳤다.
처음 제출 코드 - 오답
import Foundation
var input = readLine().map{ String($0) }
let num = Int(readLine()!)!
var cursor = input!.count
for _ in 0...num-1 {
var order = readLine()!
switch order.first {
case "L":
cursor > 0 ? (cursor -= 1) : (cursor = 0)
break
case "D":
cursor < input!.count ? (cursor += 1) : (cursor = input!.count)
break
case "B":
if (input?.count == 0) {
break
}else {
if cursor > 0 {
input!.remove(at: (input?.index(input!.startIndex, offsetBy: cursor-1))!)
cursor-=1
}else {
cursor = 0
}
}
break
case "P":
if cursor != 0 {
input!.insert(order.last!, at: (input?.index(input!.startIndex, offsetBy: cursor))!)
}else {
input!.insert(order.last!, at: input!.startIndex)
}
cursor+=1
break
default:
break
}
}
print(input)
다시봐도 코드 더럽네.. 허허ㅓㅎ..
제출 코드 - 정답
import Foundation
var stackL = Array(readLine()!)
var stackR = [Character]()
let num = Int(readLine()!)!
for _ in 0..<num {
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()) )
마무리
1. string 입력값을 array로 바꿀때, readLine().map{}이 아닌 Array(readLine()) 방법이 있다는 점
2. readLine()을 입력 받으면 띄어쓰기 기준으로 last를 판단할 수 있다는 점
3. readLine()에 대해 더 자세히 파봐야겠다.