인터넷을 좀 찾아봤다🥲 string을 자유자제로 만질수 없는... 지식의 부족이다..!!! 이번 기회에 정리를 해놓겠습니다ㅎㅎㅎ
일단 정답!!!
func solution(_ new_id:String) -> String {
var result_id = ""
// 1단계, 2단계
result_id = new_id.lowercased().filter { char in
char.isLetter || char.isNumber || char == "-" || char == "_" || char == "."
}
// 3단계
while result_id.contains("..") {
result_id = result_id.replacingOccurrences(of: "..", with: ".")
}
// 4단계
if result_id.hasPrefix(".") {
result_id.removeFirst()
}
if result_id.hasSuffix(".") {
result_id.removeLast()
}
// 5단계
if result_id.isEmpty {
result_id = "a"
}
// 6단계
if result_id.count >= 16 {
let index = result_id.index(result_id.startIndex, offsetBy: 15)
result_id = String(result_id[result_id.startIndex..<index])
if result_id.hasSuffix(".") {
result_id.removeLast()
}
}
// 7단계
if result_id.count <= 2 {
while result_id.count != 3 {
result_id = result_id + String(result_id.last!)
}
}
return result_id
}
1, 2 단계는 소문자 변환과 문자, 숫자, '-', '_', '.' 을 뺀 문자를 지우는 것이다. 이정도는 간단히...
3 단계는 ".." 이 포함되어 있을때까지 '.' 으로 변환한다.
4, 5 단계는 hasPrefix, hasSuffix 함수를 사용한다..! 처음 봤기 때문에 정리 하고 넘어가겠습니다
func hasPrefix(_ prefix: String) -> Bool
str.hasPrefix("xx") 이런식으로 사용하면 문자열이 xx으로 시작하는지 확인하고 Bool값을 리턴한다.
func hasSuffix(_ suffix: String) -> Bool
str.hasSuffix("xx") 이런식으로 사용하면 문자열이 xx으로 끝나는지 확인하고 Bool값을 리턴한다.
6 단계는 16글자가 넘어갔을때 15자로 자르고 마지막 값이 만약 '.' 이라면 제거합니다~
여기서 문자열을 자를 때 사용한 index 함수도 알아보자!
func index(_ i: String.Index, offsetBy n: String.IndexDistance) -> String.Index
우효한 index i부터 n distance 만큼 더해진 인덱스를 리턴한다. 만약 i가 0, offsetBy가 4라면 리턴되는 인덱스는 4가 되는거져~
마지막 7 단계는 문자 개수가 2개 이하일때 개수 3개가 될때까지 마지막 문자를 덧붙여 완성한다. last 프로퍼티로 마지막 값을 덧붙여줬습니다 :)