テストコード-通報結果の受信


個人的にコードテストを練習して、解答過程を書きたいです.

質問する


問題は次のリンクで確認できます.
プログラマ-レポート結果の受信
(出典:プログラマコードテスト練習、https://programmers.co.kr/learn/challenges)

どうやって解くの?


I/O分析


idを含むidリスト(リスト)と、通報情報を含むreport(リスト)を入力します.申告情報は「<ユーザid><申告者id>」で区切られている.
出力はidリストに含まれるid順に通報したユーザから受信したメール数で返される.

計画実施内容


  • 入力内容を次の形式のデータに変更します.申告者idはリスト形式で実現される.
    ユーザid申告者ididd 1[id 2,...]id2[ ]

  • 申告者idの個数がk値より大きい場合、idの使用を停止すると判定する.
    ユーザid申告者idがid 1[id 2,...]の使用を停止したかどうかTrueid2[ ]False

  • 使用を停止したidの申告者idを数え、メールの送信回数を確認します.
  • Pythonで実現


    1.ユーザidの申告者idリストをディックシャーナとして生成する


    key,ユーザid,空のリスト,valueを用いてディックシーケンスを生成する.
    report_dic = {}
    for userId in id_list:
    	report_dic[userId] = []

    2.レポート・リストの文字列を分割し、申告者idディレクトリにない場合は追加


    for文を使用して、入力したレポート・リストを処理します.各項目はスペースで区切られた文字列であるため、splitとみなされます.
    レポートIDがレポートされたuserIdのディレクトリにない場合は、リストに追加します.
    for str in report:
    	reptId, userId = str.split()
    	if reptId not in report_dic[userId]:
    		report_dic[userId].append(reptId)

    3.使用を停止するかどうかのディックマニュアルを生成する


    stop dicディレクトリをid listキーとして設定し、通報ユーザの入力値が入力したk値より大きい場合はFalseを入力する
    stop_dic = {}
    for userId in id_list:
    	if len(report_dic[userId]) >= k:
    		stop_dic[userId] = True
    	else:
    		stop_dic[userId] = False

    4.使用を停止したユーザidの申告者idにメールを送信する


    mail listを作成し、stop dicをTrueとするユーザidの申告者idを追加します.
    mail_list = []
    for userId in id_list:
    	if stop_dic[userId]:
    		mail_list += report_dic[userId]

    5.結果値を返す


    idリスト順に回答に集計し、申告者idメール数を追加して戻ります.
    answer = []
    for userId in id_list:
    	answer.append(mail_list.count(userId))
            
    return answer

    提出した答え

    def solution(id_list, report, k):
        answer = []
        
        # 이용자id에 대한 신고자id 리스트를 딕셔너리로 생성
        report_dic = {}
        for userId in id_list:
            report_dic[userId] = []
        
        # report 리스트의 문자열을 split 하여 신고자id 딕셔너리에 없을 경우 추가
        for str in report:
            reptId, userId = str.split()
            if reptId not in report_dic[userId]:
                report_dic[userId].append(reptId)
        
        # 이용정지여부 딕셔너리 생성
        # 신고자id의 갯수가 k를 넘을 경우 True 아니면 False
        stop_dic = {}
        for userId in id_list:
            if len(report_dic[userId]) >= k:
                stop_dic[userId] = True
            else:
                stop_dic[userId] = False
                
        # 이용이 정지된 이용자id의 신고자id 에게 메일 발송
        # 이용정지여부 딕셔너리가 True일 경우 신고자id 리스트를 mail_list에 추가
        mail_list = []
        for userId in id_list:
            if stop_dic[userId]:
                mail_list += report_dic[userId]
        
        # answer에 id_list 순서대로 신고자id 메일 갯수를 세어 추가한 후 return
        for userId in id_list:
            answer.append(mail_list.count(userId))
            
        return answer