[2022 KAKAO BLIND RECRUITMENT] - 신고 결과 받기
ByEunwoo
algorithmhttps://school.programmers.co.kr/learn/courses/30/lessons/92334
난이도: level 1
Logic
문제를 읽으면 대락 map(), set() 함수를 통해 (해시맵) 문제를 풀 수 있음을 짐작 할 수 있다.
"각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다" 의 조건에 의해
중복되는 값들은 제거를 해야한다.
이는 new Set() 함수를 통해 처리할 수 있다.
const reports = [...new Set(report)].map((a) => a.split(' '));
Map 객체를 생성하여 신고 당한 사람들을 가진 bad를 선언하였다.
그리고 신고한 사람들은 reporter라고 선언하였다.
문제에서 신고 당한 횟수에 의해 bad 사람들을 선별해야 하므로,
forEach함수를 통하여 reports 배열을 한 바퀴 순회하면서 신고 당한 사람이 bad 배열에 있을 경우 value 값을 1을 더하고, 없을 경우 1를 할당한다.
이후, reports 를 다시 순회하면서 신고 당한 사람, 즉 bad에 해당되는 사람 중, k번 이상 신고 된 사람은
reporter Map 객체에 값이 있으면 그 값 + 1을 하고 업승면 1을 할당한다.
return 값은 문제에서 "return 하는 배열은 id_list에 담긴 id 순서대로 각 유저가 받은 결과 메일 수를 담으면 됩니다." 라고 했으므로
id_list를 map 함수를 통해 한 바퀴 돌면서 reporter 객체에 해당 키에 해당되는 value 가 있으면 그 value 값을 가져오고 없으면 0을 반환한다.
function solution(id_list, report, k) {
const reports = [...new Set(report)].map((a) => a.split(' '));
const bad = new Map();
const reporter = new Map();
reports.forEach((v) => {
bad.set(v[1], bad.get(v[1]) + 1 || 1); // v[1]: 신고 당한 사람
});
reports.forEach((v) => {
if (bad.get(v[1]) >= k) {
reporter.set(v[0], reporter.get(v[0]) + 1 || 1);
}
});
return id_list.map((a) => reporter.get(a) || 0);
}