Level1 - 신고 결과 받기

손대중·2022년 3월 8일
0

문제 설명 및 링크

프로그래머스 - 신고 결과 받기 링크

나의 풀이

유저가 같은 사람을 여러번 신고해도 이용 정지 카운터에는 하나로 취급하기 때문에, 일단 가장 먼저 해야할 것은 reporter 리스트의 중복 제거다.

이 후 report 를 돌면서 무언가의 알고리즘으로 "각 유저별로 이용 정지 처리 결과 메일을 받은 횟수" 를 카운트해야 한다. (말이 어렵네;;;)

내가 생각한 알고리즘의 컨셉은 신고 당한 사람 - 불량자 를 기준으로, "불량자를 신고한 사람들을 체크해서 카운트 한다" 라는 것이다.

report 를 돌기 전에 아래 정보들이 담길 map 들을 준비한다.

  • 불량자에 대한 정보가 담겨 있는 map
    • 신고한 유저 리스트
    • 신고 먹은 횟수
  • 유저별 이용 정지 메일 받은 횟수 map (결국 이게 곧 result 가 될 거임)

이후 report 를 순회하면서 위 map 들을 채워 나가면 끝이며, 상세 로직은 아래와 같다.

  1. 신고자를 타겟 불량자의 신고한 유저 리스트에 추가
  2. 타겟 불량자가 신고 먹은 횟수 증가
  3. 만약 이 불량자가 이용 정지 대상이라면?
    • 이 불량자의 신고한 유저 리스트를 돌면서 유저별 이용 정지 메일 받은 횟수 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;
}

0개의 댓글