알고리즘 - 신규 아이디 추천

유준상·2021년 11월 30일
0
post-thumbnail

인터넷을 좀 찾아봤다🥲 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 프로퍼티로 마지막 값을 덧붙여줬습니다 :)

profile
iOS 개발이 즐거운 사람

0개의 댓글