
이 문제는 Lv. 1의 문제로서 2021년 카카오블라인드 채용에 나온 문제 로서 신고자와 신고당한 사람이 있고 k번 신고당하면 정지당합니다.
이때 신고한 사람의 메일로 처리결과를 발송하는데 각 아이디별로 처리결과 메일을 받은 횟수를 배열에 담아 리턴하는 문제입니다.
처음 풀이할 때는 딕셔너리에 신고당한 사람과 신고자를 defaultdict(set) 변수에 담아 처리하면 되지 않을까 해서 아래와 같이 풀이했는데, 너무 복잡하게 풀이하였다. ㅜ
from collections import defaultdict
def solution(id_list, report, k):
# 각 아이디별로 신고한 사람의 이름을 담는 딕셔너리 생성(중복 x)
person_reported = defaultdict(set)
# 최종 처리결과 메일을 받는 횟수를 담는 딕셔너리 생성
finally_reported_person = defaultdict(int)
answer = []
# 아이디별 신고한 사람들을 밸류값에 담는다.
for r in report:
start, target = r.split(' ')
person_reported[target].add(start)
# 각 아이디별 신고당한 횟수가 k번 넘으면 finally_reported_person 딕셔너리 밸류값에 횟수를 계산
for target, begin in person_reported.items():
if len(begin) >= k:
for id in person_reported[target]:
finally_reported_person[id] += 1
# 최종 정답배열에 처리결과메일을 받은 횟수를 담아 리턴
for id in id_list:
answer.append(finally_reported_person[id])
return answer
다른사람의 풀이를 참고하여 신고자와 신고당한사람의 아이디를 담는 report 배열을 set() 함수를 이용하여 중복신고자 없이 신고한 횟수를 계산할 수 있엇고, 조금더 가독성이 좋게 코드를 개선해보았다.
from collections import defaultdict
def solution(id_list, report, k):
# 처리결과 메일을 카운트하기 위해 id_list 길이만큼의 배열 생성
answer = [0] * len(id_list)
# 신고당한 횟수를 담기위한 변수 생성 : 밸류값이 기본 0값인 딕셔너리
count_person_reported = defaultdict(int)
# 신고당한 횟수 카운트
# 중복을 제거하여 한사람이 같은 사람을 신고할 수 없다.
for r in set(report):
person_reported = r.split()[1]
count_person_reported[person_reported] += 1
# 최종 처리 결과메일 카운트
for r in set(report):
report, target = r.split()
if count_person_reported[target] >= k:
answer[id_list.index(report)] += 1
return answer