유저가 같은 사람을 여러번 신고해도 이용 정지 카운터에는 하나로 취급하기 때문에, 일단 가장 먼저 해야할 것은 reporter 리스트의 중복 제거다.
이 후 report 를 돌면서 무언가의 알고리즘으로 "각 유저별로 이용 정지 처리 결과 메일을 받은 횟수" 를 카운트해야 한다. (말이 어렵네;;;)
내가 생각한 알고리즘의 컨셉은 신고 당한 사람 - 불량자 를 기준으로, "불량자를 신고한 사람들을 체크해서 카운트 한다" 라는 것이다.
report 를 돌기 전에 아래 정보들이 담길 map 들을 준비한다.
이후 report 를 순회하면서 위 map 들을 채워 나가면 끝이며, 상세 로직은 아래와 같다.
모든 프로그래머스 문제 관련 코드들은 GitHub 링크 에 있음.
function solution(id_list, report, k) {
var answer = [];
report = [...new Set(report)];
const buliangMap = {};
const hitMap = {};
report.map(r => {
const singo = r.split(' ')[0];
const buliang = r.split(' ')[1];
if (!buliangMap[buliang]) {
buliangMap[buliang] = {
// 나를 신고한 사람 리스트
singoList: [],
// 내가 신고 먹은 횟수
singoCount: 0
};
}
const currentBuliang = buliangMap[buliang];
currentBuliang.singoList.push(singo);
++currentBuliang.singoCount;
if (currentBuliang.singoCount >= k) {
currentBuliang.singoList.map(s => {
hitMap[s] = hitMap[s] ? ++hitMap[s] : 1;
});
currentBuliang.singoList = [];
}
});
answer = id_list.map(id => hitMap[id] || 0);
return answer;
}