[Algorithm] 프로그래머스 신규 아이디 추천

Updated:

문제 설명

222324

나의 풀이

import Foundation
let regex = "[a-z0-9._-]+"
func solution(_ new_id:String) -> String {
    //step1
    let lowercasedID = new_id.lowercased()
    //step2 
    let filteredID = lowercasedID.getArrayAfterRegex(regex: regex).reduce("", +)
    //step3 
    var replacedID = filteredID.replacingOccurrences(of: "..", with:".")
    while replacedID.contains("..") {
        replacedID = replacedID.replacingOccurrences(of: "..", with:".")
    }
    //step4
    var dotRemovedID = removeDotInFirstOrLast(replacedID)
    //step5
    if dotRemovedID.count < 1 {
        dotRemovedID += "a"
    }
    //step6
    if dotRemovedID.count > 15 {
        let index = dotRemovedID.index(dotRemovedID.startIndex, offsetBy: 15)
        dotRemovedID = dotRemovedID.substring(to: index)
    }
    var checkedID = removeDotInFirstOrLast(dotRemovedID)

    //step 7
    while checkedID.count < 3 {
        let char = String(checkedID.last!)
        checkedID += char
    } 
    
    return checkedID
}

func removeDotInFirstOrLast(_ id: String) -> String {
    var id = id
    if id.first == "." {
        id.removeFirst()
    }
    if id.last == "." {
        id.removeLast()
    }
    return id
}

extension String{
    func getArrayAfterRegex(regex: String) -> [String] {
        
        do {
            let regex = try NSRegularExpression(pattern: regex)
            let results = regex.matches(in: self,
                                        range: NSRange(self.startIndex..., in: self))
            return results.map {
                String(self[Range($0.range, in: self)!])
            }
        } catch let error {
            print("invalid regex: \(error.localizedDescription)")
            return []
        }
    }
}

고민한 점

정규식을 해결하기 위해서 extension 코드를 여기서 가져왔다. 나머지는 그대로 시키는 순서대로 하면 문제를 해결할 수 있다.

괜찮은 남의 풀이

import Foundation

func solution(_ new_id:String) -> String {
    var myID: String = new_id
    //1차
    myID = myID.lowercased()
    //2차
    var newID: String = ""
    for i in myID {
        if i.isLetter || i.isNumber || i == "-" || i == "_" || i == "." {
            newID.append(i)
        }
    }
    //3차
    while newID.contains("..") {
        newID = newID.replacingOccurrences(of: "..", with: ".")
    }
    //4차
    while newID.hasPrefix(".") {
        newID.removeFirst()
    }
    while newID.hasSuffix(".") {
        newID.removeLast()
    }

    //5차
    if newID == "" {
        newID = "a"
    }

    //6차
    if newID.count >= 16 {
        let index = newID.index(newID.startIndex, offsetBy: 15)
        newID = String(newID[newID.startIndex..<index])
        if newID.hasSuffix(".") {
            newID.removeLast()
        }
    }

    //7차
    if newID.count <= 2 {
        while newID.count != 3 {
            newID = newID + String(newID.last!)
        }
    }

    return newID
}

hasPrefix(), hasSuffix(), String.isLetter, String.isNumber 를 사용한 점이 다른 것 같다. 굳이 정규식을 사용하지 않아도 해결이 가능했다는 것을 할 수 있다.

참고

Programmers
Swift 정규식 적용

Leave a comment