[Swift]プログラマー-レポート結果の取得


質問リンク
https://programmers.co.kr/learn/courses/30/lessons/92334

に答える


ディクシャナリーで問題を解く.
どうしてだめなの.Programmersサイトでは入口が綺麗だったので、『ちゃんと解けるように~』と言っていましたが、TestCase 3号でタイムアウトがずっと表示されていたので、ちょっとそうでした.😅
.
この部分で逆にdictionaryを作りました.
すなわち、dict = [ 신고당한사람 : [신고자] ]は、このような形式で記述される.
後で通報された人のカウントも簡単です
例1のdict出力.2(=k)名以上の人が通報すると不良ユーザーです.

frodoとneoを通報した人が2人を超えたため、逮捕された.
frodoとneoを告発した人にメールを送ります.

Try1

    for name in dict.keys {
        if dict[name]!.count >= k {
            for n in dict[name]! {
                arr[id_list.firstIndex(of: n)!] += 1
            }       
        }
    }
countがkより大きい場合、申告者配列が呼び出され、その申告者インデックス位置+1になる.
あ.しかし前述したようにtestcase 3は常にタイムアウトを示している
考えてみるとfirstIndexはちょっと臭い.

これをつけないと?名前もidリストのindexに変えますか?......と思った.
ああああ.ids = [name: index]として保存され、firstIndexは不要です.
メモリと時間は逆比例...取引終了?...こんな関係らしい

Source Code

func solution(_ id_list:[String], _ report:[String], _ k:Int) -> [Int] {
    var dict: [String: [String]] = [:]
    var arr: [Int] = Array(repeating: 0, count: id_list.count)
    var ids: [String: Int] = [:]
    
    // 이름에 해당하는 index dictionary 생성
    for (index, id) in id_list.enumerated() {
        ids[id] = index
    }
    
    // [ 신고당한사람 : [신고자] ]
    for repo in report {
        let arr = repo.split(separator: " ").compactMap { String($0) }
        let name = arr[1]
        let singo = arr[0]
        if dict[name] == nil {
            dict.updateValue([singo], forKey: name)
        } else {
            if !dict[name]!.contains(singo) {
                dict[name]!.append(singo)
            }
        }
    }


    for name in dict.keys {
        if dict[name]!.count >= k {
            for n in dict[name]! {
                arr[ids[n]!] += 1
            }       
        }
    }
    
    return arr
}