#1. 각 유저는 한명의 유저 신고 o (동일 유저 신고횟수는 1회로 처리)
#2. k번 이상 신고된 유저는 게시판 이용이 정지. (V)
# -> dict에 신고 당한 횟수 항목을 만든 후 k번 이상일 시, 해당 id를 추출 (V)
#3 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송 (V)
# -> 해당 id를 신고한 유저가 report_id에 있으면, 그 수를 센 후에 cnt+=1 (V)
#예외처리
def solution(id_list, report, k):
answer = []
banned_id_list=[]
# dict 생성
reported_dict = {}
report=list(set(report)) #set으로 신고 중복 제거
for id_name in id_list: # 각 사람 별로 리스트 생성.
reported_dict[id_name] = {
"report_id" : [], #신고한 id
"reported_num" : 0 #신고 당한 횟수
}
for report_name in report: # report에서 신고인, 피신고인 분류
report_person_name, reported_person_name = report_name.split()
for id_name in id_list:
if id_name==reported_person_name: # 본인의 id가 신고를 당했을 경우
reported_dict[id_name]["reported_num"]+=1 #신고 당한 횟수를 추가
if id_name==report_person_name: #본인의 id가 신고를 했을 경우
reported_dict[id_name]["report_id"].append(reported_person_name)
#해당 id가 신고한 사람을 추가
for id_name in reported_dict:
if reported_dict[id_name]["reported_num"]>=k: # 해당 id가 k번 이상 신고 당했을 경우
banned_id_list.append(id_name) # banned_id에 해당 id를 추가
banned_id_list=list(set(banned_id_list)) #중복 제거
for id_name in reported_dict:
cnt=0
for banned_id in banned_id_list: #정지된 id 체크
if banned_id in reported_dict[id_name]["report_id"]: # 정지된 id가 신고한 id에 있으면 메일 수 1증가
cnt+=1
answer.append(cnt)
return answer
- k번 이상 신고 당했을 시 체크 여부를 for문에 넣어서 시간 초과가 났음.
- 딕셔너리 사용법 숙지
빠른 풀이
def solution(id_list, report, k):
answer = [0] * len(id_list)
reports = {x : 0 for x in id_list} #신고 당한 횟수 dictionary
for r in set(report):
reports[r.split()[1]] += 1 # 피신고인 id에 신고 당한 횟수 +1 씩
for r in set(report):
if reports[r.split()[1]] >= k: #신고 당한 횟수가 k를 넘어갈 때
answer[id_list.index(r.split()[0])] += 1 # answer의 id_list 항목에 1증가
return answer
solution(["muzi", "frodo", "apeach", "neo"],["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"],2)
https://programmers.co.kr/learn/courses/30/lessons/92334