본문 바로가기
알고리즘/프로그래머스

[프로그래머스][자바스크립트][Level1][카카오] 신고 결과 받기

by Benjamin_Choi 2022. 2. 11.

풀이

 

 

/**
 * 신고결과받기.js
 * https://programmers.co.kr/learn/courses/30/lessons/92334
 */

function solution(id_list, report, k) {
    const id_report = id_list.reduce((obj, id) => {
        obj[id] = { reportList: new Set([]), reported: 0 }
        return obj;
    }, {});

    report.forEach((value) => {
        const [userId, reportedId] = value.split(" ");
        if (!id_report[userId]["reportList"].has(reportedId)) {
            id_report[userId]["reportList"].add(reportedId);
            id_report[reportedId]["reported"]++;
        }
    });

    return id_list.map((id) => {
        let num = 0;
        id_report[id].reportList.forEach((l) => {
            if (id_report[l].reported >= k) num++;
        });
        return num;
    });
}

 

  • 2 ≤ id_list의 길이 ≤ 1,000
  • 1 ≤ report의 길이 ≤ 200,000
  • 1 ≤ k ≤ 200, k는 자연수입니다.

 

문제 제약 중 파라미터로 넘겨받는 값들의 범위가 위와 같으므로 가장 크기가 큰 report 를 효과적으로(O(n)) 처리하기 위해 신경썼다. 

 

id_list 값을 key 로 갖는 객체(id_report)를 만들어서 reportList 와 reported 를 초기화해줬다. reportList 는 key값에 해당하는 유저가 report 한 id의 집합이고(중복 리포트가 불가능하므로 집합으로 처리), reported 는 key값에 해당하는 유저 본인이 리포트당한 횟수다. 

 

report 를 1회 순회하면서 reportList 에 넣어줄 내용과, reported 에 횟수 추가해야되는 내용을 확인해서 처리해준다.

 

return 해야하는 배열의 순서가 id_list와 동일하므로 id_list 를 map 으로 순회하면서  각 reportList 에 본인이 report한 reportList를 순회하면서 k 이상 으로 신고받은 개수를 num에 넣어서 return 해주면 바로 answer 값에 맞는 배열을 얻을 수 있다.

댓글