풀이
/**
* 신고결과받기.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 값에 맞는 배열을 얻을 수 있다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스][자바스크립트][Level1][카카오] 비밀 지도 (0) | 2022.02.13 |
---|---|
[프로그래머스][자바스크립트][Level1][카카오] 다트 게임 (0) | 2022.02.11 |
[프로그래머스][자바스크립트][Level2] 위장 (0) | 2022.01.10 |
[프로그래머스][자바스크립트][Level1] 최소 직사각형 (0) | 2022.01.09 |
[프로그래머스][자바스크립트][Level1] 약수의 개수와 덧셈 (0) | 2022.01.09 |
댓글