📚 목차

    [2022 KAKAO BLIND RECRUITMENT] - 신고 결과 받기

    ByEunwoo
    algorithm

    https://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);
    }
    Posted inalgorithm
    Written byEunwoo