중복 체크 및 카운트가 관건인 문제. 시간 효율성을 위해 리스트가 아닌 딕셔너리로 구현하였다. 딕셔너리/리스트 컴프리헨션을 통해 간결하게 표현하자. 질문 케이스를 살펴보니 시간 초과 등 문제가 있었는데, 파이썬의 경우 딕셔너리가 대부분 (해쉬 기능을 통해) 시간 효율성을 매우 높일 수 있는 좋은 자료구조라 생각한다.
def solution(id_list, report, k):
ids = {id:set() for id in id_list}
for rep in report:
reporter, reported = rep.split(" ")
ids.get(reported).add(reporter)
# 딕셔너리 사용. 각 id는 자신을 신고한 reporter를 기록한다. 중복 케이스는 set으로 커버.
report_cnt = {id:0 for id in id_list}
# 자신을 신고한 reporter 수가 k 이상이면 해당 reporter에게 보내지는 메일 +1.
for value in ids.values():
if len(value) >= k:
for reporter in value:
cnt = report_cnt.get(reporter)
report_cnt[reporter] = cnt+1
result = [cnt for cnt in report_cnt.values()]
# id_list 순서대로 기록되었으므로(defaultdict와 상동) 그대로 리스트로 return.
return result