문자열을 조건에 따라 필터링하는 게 문제 풀이의 관건. 다소 까다로운 스위프트 문자열은 인덱스를 통해 접근하는데, 나 같은 경우 문자열 배열로 전환해서 대부분 해결한다. 물론 캐릭터 자체가 시간적인 측면에서 보다 효율적이긴 한데, 시간 초과가 나지 않는다면 처음에 시도한 문자열 배열로 접근하고 있다.
import Foundation
func solution(_ new_id:String) -> String {
let newId = makeNewId(new_id)
return newId
}
func makeNewId(_ id: String) -> String {
var id = id.lowercased()
var tmp = ""
for letter in id {
if letter.isLetter || letter.isNumber || letter == "-" || letter == "_" || letter == "." {
tmp += String(letter)
}
}
id = tmp
var idArray = Array(id).map{String($0)}
var tmpIdx = -2
var dotIndices = [Int]()
for idx in 0..<idArray.count {
let letter = idArray[idx]
if letter == "." {
if idx - tmpIdx == 1 {
dotIndices.append(idx)
}
tmpIdx = idx
}
}
tmpIdx = 0
for idx in dotIndices {
idArray.remove(at: idx - tmpIdx)
tmpIdx += 1
}
if let first = idArray.first, first == "." {
idArray.removeFirst()
}
if let last = idArray.last, last == "." {
idArray.removeLast()
}
if idArray.isEmpty {
idArray.append("a")
}
if idArray.count >= 16 {
idArray = Array(idArray[0..<15])
}
if let last = idArray.last, last == "." {
idArray.removeLast()
}
if idArray.count <= 2 {
let lastString = idArray.last!
while idArray.count != 3 {
idArray.append(lastString)
}
}
let newId = idArray.joined()
return newId
}