2022 KAKAO BLIND RECRUITMENT
LEVEL 1
게시판 불량 이용자를 신고하고 신고 처리 결과를 메일로 발송하는 시스템을 만들고자 한다.
k
번 이상 신고된 유저는 게시판 이용 정지되고, 정지된 유저를 신고한 유저들에게는 해당 사실을 메일로 발송한다. 이 때, 각 유저별로 신고 처리 결과 메일을 받은 횟수를 배열에 담아 return
하는 solution
함수를 작성하시오.
id_list
id_list
의 길이 ≤ 1,000id_list
의 원소 길이 ≤ 10report
각 이용자가 신고한 이용자의 ID 정보가 담긴 문자열 배열
1 ≤ report
의 길이 ≤ 200,000
3 ≤ report
의 원소 길이 ≤ 21
report
의 원소는 "이용자id 신고한id"의 형태의 문자열
k
정지 기준이 되는 신고 횟수
1 ≤ k
≤ 200, k
는 자연수
id_list
에 담긴 id 순서대로 각 유저가 받은 결과 메일 횟수를 담은 배열report
배열을 순회하면서 reportedResult
, reporterResult
객체를 채운다.reportedResult
는 이용자의 ID를 키로 가지고, 해당 유저를 신고한 이용자들의 ID를 담은 Set을 값으로 가진다. (같은 이용자에게 여러번 신고 당할 수도 있으므로 중복을 피하기 위해 배열이 아닌 Set을 사용)reporterResult
는 이용자의 ID를 키로 가지고, 해당 유저가 신고한 이용자들의 ID를 담은 Set을 값으로 가진다. (마찬가지로 같은 유저를 여러번 신고할 수도 있으므로 중복을 피하기 위해 배열이 아닌 Set을 사용)id_list
배열을 순회하면서 reportedResult
객체를 참고하여 신고당한 횟수가 k
이상인 이용자들의 ID를 suspended
배열에 추가한다.reportedResult
에서 해당 이용자의 ID를 키로 가지는 Set의 size
와 같다.id_list
배열의 ID들을 순서대로 순회하면서 각 이용자가 suspended
에 있는 이용자들 중 몇명이나 신고했는지를 구해 answer
배열에 추가한다.answer
배열을 return
한다.function solution(id_list, report, k) {
// 1. report 배열을 순회하면서 reportedResult, reporterResult 객체를 채운다
const reportedResult = {};
const reporterResult = {};
for (let i = 0, n = id_list.length; i < n; i++) {
const userID = id_list[i];
reportedResult[userID] = new Set();
reporterResult[userID] = new Set();
}
for (let i = 0, n = report.length; i < n; i++) {
const [reporter, reported] = report[i].split(' ');
reportedResult[reported].add(reporter);
reporterResult[reporter].add(reported);
}
// 2. id_list 배열을 순회하면서 reportedResult 객체를 참고하여
// 신고당한 횟수가 k 이상인 이용자들의 ID를 suspended 배열에 추가한다
const suspended = [];
for (let i = 0, n = id_list.length; i < n; i++) {
const userID = id_list[i];
if (reportedResult[userID].size >= k) {
suspended.push(userID);
}
}
// 3. id_list 배열의 ID들을 순서대로 순회하면서 각 이용자가 suspended에 있는 이용자들 중
// 몇명이나 신고했는지를 구해 answer 배열에 추가한다
const answer = [];
for (let i = 0, n = id_list.length; i < n; i++) {
const userID = id_list[i];
const reportedUsers = reporterResult[userID];
let count = 0;
for (let j = 0, m = suspended.length; j < m; j++) {
if (reportedUsers.has(suspended[j])) {
count++;
}
}
answer.push(count);
}
// 4. answer 배열을 return 한다
return answer;
}