반응형
문제 풀이
이게 정말 레벨1 문제인가..? 카카오 기술 블로그에서는 해시 자료구조를 활용할 수 있는지에 대한 문제라고 설명한다. (게다가 정답률이 80.13%다. 😲)
1. userList 만들기
const userList = id_list.reduce((result, currentId) => {
result[currentId] = [0, []];
return result;
}, {});
먼저 신고된 횟수와 신고한 유저를 담을 userList를 만든다. reduce() 메서드를 통해 이런식으로 객체를 만들 수 있다는 것을 다시 한번 배우게 됐다.
2. userList에 신고된 횟수, 신고한 유저 ID 담기(중복 제거)
for (const id of new Set(report)) {
const [REPORT_ID, ID] = id.split(' ');
userList[REPORT_ID][1].push(ID);
userList[ID][0]++;
}
동일한 유저에 대한 신고 횟수는 1회로 처리되기 때문에 중복을 제거 해야 한다. Set을 통해 중복을 제거하고, 순회하면서 split() 메서드로 '신고한 유저'와 '신고된 유저'를 나눠 준다. 그 후 신고한 유저의 ID를 담고, 신고된 횟수를 +1 한다.
3. 정지된 유저와 메일 리스트
const banned = id_list.filter((id) => userList[id][0] >= k);
const emailList = id_list.map((id) => {
return userList[id][1].filter((id) => {
return banned.includes(id);
}).length;
});
유저가 신고한 ID가 정지 되었을 경우 메일을 받게 된다. 따라서 정지 기준인 k회 이상 신고된 ID를 변수에 담는다. 유저마다 신고한 ID가 정지가 됐다면 해당 ID를 추가한다. 마지막으로 그 결과의 수를 반환한다.
전체 코드
function solution(id_list, report, k) {
const userList = id_list.reduce((result, currentId) => {
result[currentId] = [0, []];
return result;
}, {});
for (const id of new Set(report)) {
const [REPORT_ID, ID] = id.split(' ');
userList[REPORT_ID][1].push(ID);
userList[ID][0]++;
}
const banned = id_list.filter((id) => userList[id][0] >= k);
const emailList = id_list.map((id) => {
return userList[id][1].filter((id) => {
return banned.includes(id);
}).length;
});
return emailList;
}
참고
신고 결과 받기 - 프로그래머스
2022 카카오 신입 공채 1차 온라인 코딩테스트 문제해설 - 카카오 기술 블로그
Array.prototype.reduce() - MDN
맵과 셋 - javascript.info
반응형
'Algorithm' 카테고리의 다른 글
[프로그래머스] 위장 | JavaScript (0) | 2021.08.17 |
---|---|
[프로그래머스] 멀쩡한 사각형 | JavaScript (0) | 2021.08.15 |
[백준] 단계별로 풀어보기 4단계 | Node.js (0) | 2021.07.09 |
[프로그래머스] 올바른 괄호 | JavaScript (0) | 2021.07.02 |
[프로그래머스] 땅따먹기 | JavaScript (4) | 2021.06.29 |