drop-of-water

문제 링크

조건

  • 한번에 한 유저를 신고 가능 → A유저가 B,C 유저를 동시에 신고할 수 없음 (신고한 내용은 ‘userA userB’ 형태를 가짐)
  • 동일한 유저 신고 횟수는 1회로 처리 → A유저가 B유저를 두번 이상 신고해도 1번 신고한걸로 처리됨
  • 신고 횟수 제한 없음
  • k번 이상 신고된 유저는 정지 → k가 2이고 A유저가 C유저를 신고했고 B유저도 C유저를 신고하면 C유저는 정지됨
  • 신고된 모든 내용을 취합 후 신고한 유저들에게 정지 사실 이메일 보내짐
  • 자기 자신을 신고할 수 없음

입력값

  • id_list = 모든 유저 아이디 목록 (배열)
  • report = 유저가 신고한 내용 목록 (배열)

출력값

  • 각 유저가 받은 정지 사실 이메일 갯수 목록 (배열)
  • id_list에 담긴 id 순서대로 담아야됨

풀이과정

  • key, value 형태로 데이터를 저장하는 HashMap 사용
  • key에는 유저 아이디, value에는 해당 유저를 신고한 유저 목록 저장
  • report 배열을 traverse 하면서 유저 신고 목록을 HashMap에 저장
  • HashMap을 traverse 하면서 어떤 유저가 k번 이상 신고당한 경우 해당 유저를 신고한 유저들의 정지 사실 이메일 갯수를 1만큼 증가

코드

function solution(id_list, report, k) {
  const answer = Array(id_list.length).fill(0);
  const report_hashmap = {};

  id_list.forEach((id) => {
    report_hashmap[id] = [];
  });

  report.forEach((item) => {
    // 신고한 내용은 ‘userA userB’ 형태를 가짐
    const [reporter_id, reported_id] = item.split(' ');

    // 동일한 유저 신고 횟수는 1회로 처리
    if (!report_hashmap[reported_id].includes(reporter_id)) {
      report_hashmap[reported_id].push(reporter_id);
    }
  });

  for (const key in report_hashmap) {
    if (report_hashmap[key].length >= k) {
      report_hashmap[key].forEach((reporter_id) => {
        // id_list에 담긴 id 순서대로 담아야됨
        answer[id_list.indexOf(reporter_id)] += 1;
      });
    }
  }

  return answer;
}

😊