テストコード-通報結果の受信
個人的にコードテストを練習して、解答過程を書きたいです.
問題は次のリンクで確認できます.
プログラマ-レポート結果の受信
(出典:プログラマコードテスト練習、https://programmers.co.kr/learn/challenges)
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を数え、メールの送信回数を確認します.
key,ユーザid,空のリスト,valueを用いてディックシーケンスを生成する.
for文を使用して、入力したレポート・リストを処理します.各項目はスペースで区切られた文字列であるため、splitとみなされます.
レポートIDがレポートされたuserIdのディレクトリにない場合は、リストに追加します.
stop dicディレクトリをid listキーとして設定し、通報ユーザの入力値が入力したk値より大きい場合はFalseを入力する
mail listを作成し、stop dicをTrueとするユーザidの申告者idを追加します.
idリスト順に回答に集計し、申告者idメール数を追加して戻ります.
質問する
問題は次のリンクで確認できます.
プログラマ-レポート結果の受信
(出典:プログラマコードテスト練習、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
Reference
この問題について(テストコード-通報結果の受信), 我々は、より多くの情報をここで見つけました https://velog.io/@zbooster/코딩테스트-신고결과받기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol