[Algorithm] 프로그래머스 신규 아이디 추천
Updated:
문제 설명
나의 풀이
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
를 사용한 점이 다른 것 같다. 굳이 정규식을 사용하지 않아도 해결이 가능했다는 것을 할 수 있다.
Leave a comment