[プログラマー]新しいアイデンティティを推奨

29254 ワード

📝 質問する


新しいIDの推奨

🔍マイコード


func solution(_ new_id:String) -> String {
    //아이디 길이 3자 이상 15자 이하
    //알파벳 소문자, 숫자, -, _, . only
    //마침표 처음과 끝 X, 연속 X
    
    var recom_id: String //추천아이디를 담을 문자열. 스네이크 케이스로 써도 되나
    //✅ 1단계 : 모든 대문자를 소문자로 치환
    recom_id = new_id.lowercased()
    
    //String을 Array로 변경
    var arr_recom_id = Array(recom_id)
    //
     
 

    //✅ 2단계 : 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거
    // arr_recom_id = arr_recom_id.filter{ $0.isNumber == true || $0.isLowercase == true ||  $0 == "-" || $0 == "_" || $0 == "."}
    // filter함수 시간초과나서 변경
    
        for i in 0..<arr_recom_id.count{
        if(arr_recom_id[i].isNumber == true || arr_recom_id[i].isLowercase == true ||  arr_recom_id[i] == "-" || arr_recom_id[i] == "_" || arr_recom_id[i] == "."){
            
            revised_id.append(arr_recom_id[i])
            
        }
    }
    
    
    //✅ 3단계 : 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환
    var revised_id: Array<Character> = []//중복된 . 을 제거한 문자열을 임시로 담을 배열

    revised_id.append(arr_recom_id[0])//첫번째 원소 집어넣어주기
    
    //두번 째 인덱스에 있는 문자열부터 맨 끝 문자열 하나씩 확인
    for i in 1..<arr_recom_id.count{
        
        //현재 인덱스 문자열과 이전 문자열이 둘 다 "."이면 현재 문자열 추가 x
        if(arr_recom_id[i-1]=="." && arr_recom_id[i] == "."){
           continue
        }else{//현재 문자열이 "."이 아니거나 현재문자열이 "."이더라도 앞에 문자열이 "."이 아니므로 일단 추가
            revised_id.append(arr_recom_id[i])
        }
    }
    arr_recom_id = revised_id //중복된 . 이 제거된 문자열이 완성 되어 추천아이디에 재 대입.
    

    
    //✅ 4단계 : 마침표(.)가 처음이나 끝에 위치한다면 제거
    if(arr_recom_id.first == "."){
        arr_recom_id.removeFirst()
    }
    
    if(arr_recom_id.last == "."){
        arr_recom_id.removeLast()
    }
    
    //✅ 5단계 : 빈 문자열이라면, new_id에 "a"를 대입
    if(arr_recom_id.isEmpty){
        arr_recom_id.append("a")
    }
    
    //✅ 6단계 : 길이가 16자 이상이면, 앞의 15개의 문자를 제외 모두 제거.
    //만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
    
    if(arr_recom_id.count>=16){
        arr_recom_id.removeSubrange(16...arr_recom_id.count-1)//더좋은 범위 연산자가 있나
    }
    if(arr_recom_id.last == "."){
        arr_recom_id.removeLast()
    }
    
    //✅ 7단계 : 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
    while(arr_recom_id.count < 3){
            
        arr_recom_id.append(arr_recom_id[arr_recom_id.count-1])
        
    }
    
    recom_id = String(arr_recom_id)
    
    return recom_id
}
    

💡より良いコード(簡潔な他人の解答)

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
}

📖 学識


私は努力して問題を解いて、正解も得ましたが、他の人がよくやっているコードを見て、私のコード会議には多くの問題があると思います.SWIFT言語のメリットが全く発揮されず、コード作成中です.多くの不足を感じて、多くのものを学びました.

1 . この問題はString線上では解決可能な問題なので、並べ替える必要はありません。


ある種の配列という資料構造を使っていろいろな機能が使えると思うので、配列に変えて解答しましたが、解答コードから見るとStringが持つ関数も完全に解決できる問題です.
文字列の問題はString線で解決できますか?
この疑問点を判断するためには、いろいろな問題に触れて判断しなければならない.解けばStringではありえない問題が発生する可能性があります...

2.配列内の各要素をチェックするとき、インデックスが必要でない場合は、要素値のみを使用してチェックします。


習慣のように、常にインデックスを使用して配列された要素を決定します.

   
    for i in 0..<arr_recom_id.count{
        if(arr_recom_id[i].isNumber || arr_recom_id[i].isLowercase ||  arr_recom_id[i] == "-" || arr_recom_id[i] == "_" || arr_recom_id[i] == "."){
            
            revised_id.append(arr_recom_id[i])
            
        }
    }
  
上のコードを下のコードのように簡単にしましょう.
for i in arr_recom_id{
        if(i.isNumber || i.isLowercase == true ||  i == "-" || i == "_" || i == "."){
            
            newID.append(i)
            
        }
    }

3.変数名はラクダのみ


プログラマが入力したパラメータはsnakeなのでsnakeで書きました...あまり速くなくて読みにくいので次回はラクダを使います

SWIFT Stringの各種関数


1. lowercased() & uppercased()


:文字列をすべて小文字または大文字に置き換えて返す関数

2.append()


パラメータとして受信した文字列を文字列の最後に追加する関数です.

3.contains()


パラメータとして入力された文字列が含まれているかどうかを決定する関数です.

4.replacingOccurences()


:targetに一致する文字列を置換Stringに変換します.

NSStringの関数ですがNSStringはSWIFTのStringとBridgeなので使えます.
[Appleドキュメント]
SWIFTのStringタイプはファンデーション液のNSString類とブリッジしています.一方、ファンデーションはStringタイプを拡張することができ、NSStringで定義された方法を利用することができる.これは、ファンデーションをインポートした後、StringタイプでNSStringメソッドを使用して、他の鋳造を行う必要がないことを意味します.
ブリッジは無料の変換です.タイプ自体がXを自動的に変換し、タイプに関連するAPIが互換タイプのタイプに自動的に変換されます.

5.hasPrefix() & hasSuffix

hasPrefix():Stringがパラメータ入力のStringで始まるかどうかhasSuffix():Stringパラメータ入力のStringで終了

6.removeFirst() & removeLast()

removeFirst():Stringの最初の文字を削除removeLast():Stringの最後の文字を削除

外部Stringの各種関数


Appleドキュメント-String
Appleドキュメント-NSString

String文字列要素アクセステクニック


文字列要素にアクセスするには、subscriptを使用してCharacter値にアクセスします.
subscriptとは、カッコ[]に特定の値を入れて、シーケンスやバイナリなどの必要な値を直接検索する機能です.
ex ) str[3]
ただしswiftの文字列はInt型のインデックス値でアクセスできず、String.Index型を入れる必要があります.
let str = "ABCDE"
str[str.startIndex] // A
str[str.index(after: str.startIndex)] // B
str[str.index(before: str.endIndex)] // E

str[str.index(str.startIndex, offsetBy: 2] // C
str[str.index(str.endIndex, offsetBy: -2] // D
上記のように、index()を使って所望のString.indexを生成した後、[]に入れる必要がありますが、非常に不便です.
したがって,拡張を用いてStringのsubscript()関数を下に上書きすると,より便利になる.
extension String {
    subscript(_ index: Int) -> Character {
        return self[self.index(self.startIndex, offsetBy: index)]
    }
}

let str = "aBcDeF"
print(str[3]) // D 
リファレンスリンク

Array(String)


:Stringを文字配列に変更します.
let name = "Marie Curie"
print(Array(name))
// Prints "["M", "a", "r", "i", "e", " ", "C", "u", "r", "i", "e"]"