신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다.
다음은 전체 유저 목록이 ["muzi", "frodo", "apeach", "neo"]이고, k = 2(즉, 2번 이상 신고당하면 이용 정지)인 경우의 예시입니다.
유저 ID | 유저가 신고한 ID | 설명 |
---|---|---|
"muzi" | "frodo" | "muzi"가 "frodo"를 신고했습니다. |
"apeach" | "frodo" | "apeach"가 "frodo"를 신고했습니다. |
"frodo" | "neo" | "frodo"가 "neo"를 신고했습니다. |
"muzi" | "neo" | "muzi"가 "neo"를 신고했습니다. |
"apeach" | "muzi" | "apeach"가 "muzi"를 신고했습니다. |
각 유저별로 신고당한 횟수는 다음과 같습니다.
유저 ID | 신고당한 횟수 |
---|---|
"muzi" | 1 |
"frodo" | 2 |
"apeach" | 0 |
"neo" | 2 |
위 예시에서는 2번 이상 신고당한 "frodo"와 "neo"의 게시판 이용이 정지됩니다. 이때, 각 유저별로 신고한 아이디와 정지된 아이디를 정리하면 다음과 같습니다.
유저 ID | 유저가 신고한 ID | 정지된 ID |
---|---|---|
"muzi" | ["frodo", "neo"] | ["frodo", "neo"] |
"frodo" | ["neo"] | ["neo"] |
"apeach" | ["muzi", "frodo"] | ["frodo"] |
"neo" | 없음 | 없음 |
따라서 "muzi"는 처리 결과 메일을 2회, "frodo"와 "apeach"는 각각 처리 결과 메일을 1회 받게 됩니다.
이용자의 ID가 담긴 문자열 배열 id_list, 각 이용자가 신고한 이용자의 ID 정보가 담긴 문자열 배열 report, 정지 기준이 되는 신고 횟수 k가 매개변수로 주어질 때, 각 유저별로 처리 결과 메일을 받은 횟수를 배열에 담아 return 하도록 solution 함수를 완성해주세요.
id_list | report | k | result |
---|---|---|---|
["muzi", "frodo", "apeach", "neo"] | ["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"] | 2 | [2,1,1,0] |
["con", "ryan"] | ["ryan con", "ryan con", "ryan con", "ryan con"] | 3 | [0,0] |
프로그래머스 2022 KAKAO BLIND RECRUITMENT 신고 결과 받기
각 유저가 신고한 유저 중 몇 명의 유저가 정지되었는가를 찾아내는 문제입니다.
저는 이 문제를 풀기 위해서 아래👇와 같은 두 내용을 찾아야 한다고 생각하였습니다.
k
번 이상 신고당한 유저들의 명단k
번 이상 신고당한 유저들을 찾아냅니다. 따라서, dictionary 두 개를 활용하여 위의 두 내용을 저장하고, 각 유저들이 신고한 유저들 중 신고당한 유저들의 수를 반환할 수 있도록 하였습니다.
def solution(id_list, report, k):
report_list = {id : set() for id in id_list} # 각 유저 신고명단
reported_number = {id : 0 for id in id_list} # 각 유저 신고당한 횟수
for r in report: # report 리스트
a, b = r.split() # a : 신고한 유저, b : 신고당한 유저
reported_number[b] += 0 if b in report_list[a] else 1
report_list[a].add(b)
reported_number = set([x[0] for x in list(reported_number.items()) if x[1] >= k])
return [len(reported_number.intersection(a)) for a in list(report_list.values())]
report_list
: 각 유저가 신고한 유저들의 명단을 담은 dictionary로, {유저 id : 해당 유저가 신고한 유저들의 집합}
으로 구성되어 있습니다 .reported_number
: 각 유저들이 몇 번 신고당했는지를 담은 dictionary로, {유저 id : 해당 유저가 신고당한 횟수}
로 구성되어 있습니다.k
이상이 되어 정지당한 유저들의 집합으로 값이 변경됩니다. input으로 들어오는 report
의 값들을 하나씩 확인합니다.
a
가 b
를 이미 신고한 적이 있어 report_list[a]
집합에 b
가 포함되어 있다면 reported_numer[b]
에는 0을, 그렇지 않다면 1을 더해줍니다.
그리고, report_list[a]
에는 b
를 그냥 추가해줍니다. 집합이기 때문에, 중복은 자동으로 제거됩니다.
그 후, reported_number
에 신고횟수가 k
번 이상인 유저들의 이름만 모아 집합으로 저장해줍니다.
최종적으로 각 유저가 신고한 유저들의 집합과, 정지당한 유저들의 집합의 교집합 수를 반환해주면 됩니다.