본문 바로가기

About/Algorithm

[Programmers] 신고 결과 받기 (Python 풀이) - 2022 KAKAO BLIND RECRUITMENT

https://programmers.co.kr/learn/courses/30/lessons/92334

 

코딩테스트 연습 - 신고 결과 받기

문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의

programmers.co.kr

 

풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from collections import defaultdict
 
def solution(id_list, report, k):
    answer = []
 
    report_to_from = defaultdict(set) # key(id)를 신고한 목록
    report_from_to = defaultdict(set) # key(id)가 신고한 목록
    for r in report:
        report_from, report_to = r.split(' '# 공백을 기준으로 from/to 구분
        report_to_from[report_to].add(report_from) # report_to를 신고한 목록에 from 추가
        report_from_to[report_from].add(report_to) # report_from이 신고한 목록에 to 추가
 
    for _id in id_list:
        cnt = 0
        for r_to in report_from_to[_id]: # _id가 신고한 목록에서 아이디를 가져옴(r_to)
            if len(report_to_from[r_to]) >= k:  # r_to 신고한 목록의 개수가 k 이상인 경우 cnt++
               cnt += 1
        answer.append(cnt)
    return answer
 
cs

 

우선 id가 신고한 목록을 저장할 dictid를 신고한 목록을 저장할 dict를 선언합니다. 같은 유저를 여러번 신고하는 경우 1번 신고한 것으로 처리되기 때문에 여러 번 신고한 것에 대해 중복을 없애기 set 자료형을 default value로 가지는 defaultdict로 선언합니다.

그리고 report 리스트에서 신고 목록을 가져와 split()함수를 이용하여 report_from(누구로부터) report_to(누구에게)로 구분하며, 각각 dict에 저장합니다.

마지막으로 id 리스트에서 id를 가져와 해당 id가 신고한  신고 목록을 확인합니다. (report_from_to), 그리고 해당 신고목록에서 신고당한 id를 가져와(r_to) 해당 id(r_to)를 신고한 목록의 개수를 확인합니다. 이 때 개수가 k개 이상인 경우 count를 증가시키며, 이 과정이 마무리되면 answer 리스트에 카운트를 추가합니다.