## 의사코드 ##
# report에 대한 정보를 나눠 담을 dict() 생성
# report의 원소에서 이용자id를 dict의 key로, 신고한id를 dict의 value로 dict에 추가
# -> 이때, dict의 value는 리스트로 추가 => defaultdict(list) 활용
# => dict = {유저id: [유저가 신고한 id들], ..., 유저id: [유저가 신고한 id들]}
# -> dict의 key인 유저id는 id_list에 나온 순서대로 정렬
# 유저id별로 신고당한 횟수 카운트
# k번 이상 신고된 유저 -> 이용 정지
통과한 코드
from collections import defaultdict
def solution(id_list, report, k):
answer = []
report = list(set(report)) # 한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리 -> 중복 제거
report_dic = defaultdict(list) # 유저 id별로 신고한 id
report_cnt = defaultdict(int) # 유저 id별로 신고당한 횟수
for r in report:
user, reported = r.split() # ["이용자id", "신고한id"] -> user = r.split()[0], reported = r.split()[1]
report_dic[user].append(reported) # {유저id: [유저가 신고한 id들]}
report_cnt[reported] += 1 # 유저 id별로 신고당한 횟수 저장
# id_list의 id순으로
for id in id_list:
result = 0 # 처리 결과 메일을 받은 횟수
# id_list의 id가 report_dic 또는 report_cnt에 없는 경우
if id not in report_dic.keys(): # id_list의 id가 report_dic에 없으면
report_dic[id].append(None) # None 추가 -> {'id': [None]}
if id not in report_cnt.keys(): # id_list의 id가 report_cnt에 없으면
report_cnt[id] = 0 # 0 추가 -> {'id': 0}
# id_list의 id순으로 신고한 id
for rp in report_dic[id]:
if report_cnt[rp] >= k: # id_list의 id순으로 신고한 id의 신고당한 횟수가 k 이상인 경우 -> 이용 정지
result += 1 # 처리 결과 메일을 받은 횟수 + 1
answer.append(result) # id_list의 id순으로 처리 결과 메일을 받은 횟수 추가
return answer
-> 며칠 전 풀었던 '위장' 문제에서 사용했던 defaultdict를 활용해서 key가 중복되는 경우, value 값을 리스트로 추가
-> 각 유저별로 처리 결과 메일을 받은 횟수를 id_list에 담긴 id 순서대로 담는 방법은 for문을 id_list의 id 순으로 돌리면 됨
id_list의 id가 report_dic 또는 report_cnt에 없는 경우 추가하는 코드 삭제한 ver.
from collections import defaultdict
def solution(id_list, report, k):
answer = []
report = list(set(report)) # 한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리 -> 중복 제거
report_dic = defaultdict(list) # 유저 id별로 신고한 id
report_cnt = defaultdict(int) # 유저 id별로 신고당한 횟수
for r in report:
user, reported = r.split() # ["이용자id", "신고한id"] -> user = r.split()[0], reported = r.split()[1]
report_dic[user].append(reported) # {유저id: [유저가 신고한 id들]}
report_cnt[reported] += 1 # 유저 id별로 신고당한 횟수 저장
# id_list의 id순으로
for id in id_list:
result = 0 # 처리 결과 메일을 받은 횟수
# id_list의 id순으로 신고한 id
for rp in report_dic[id]:
if report_cnt[rp] >= k: # id_list의 id순으로 신고한 id의 신고당한 횟수가 k 이상인 경우 -> 이용 정지
result += 1 # 처리 결과 메일을 받은 횟수 + 1
answer.append(result) # id_list의 id순으로 처리 결과 메일을 받은 횟수 추가
return answer
-> id_list의 id가 report_dic 또는 report_cnt에 없는 경우를 따로 추가하지 않아도 같은 결과 나옴 (따로 추가할 필요 x)