Algorithm
프로그래머스 - 신고 결과 받기
b._.omi
2023. 5. 12. 14:53

문제



풀이
먼저 한 유저가 같은 유저를 여러번 신고를 해도 1회 신고로 처리하기 위해 report 배열에서 중복제거를 해준다.
이 후 id_list와 매칭할 수 있는 유저당 신고 당한횟수 배열과 유저당 받은 메일 횟수 배열을 만들어 유저당 신고 당한횟수 배열에 유저당 신고당한 횟수를 채운다.
이 후 신고당한 횟수가 정지 조건인 k보다 많은 인덱스에 해당하는 유저당 받은 메일 횟수 배열 인덱스를 증가시킨다.
코드를 보면서 예시 1번을 진행해보자.
function solution(id_list, report, k) {
// report 배열에서 중복 제거
let setReportArray = [...new Set(report)];
// 각 유저당 신고당한 횟수 이 배열은 id_list 유저 순서와 동일 ex) [0, 0, 0, 0]
let reportedUser = Array(id_list.length).fill(0);
// 각 유저당 받은 메일 횟수 이 배열은 id_list 유저 순서와 동일 ex) [0, 0, 0, 0]
let receivedMail = Array(id_list.length).fill(0);
// ' ' 기준으로 문자열 자르기
// ex) ["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"]
// => [[muzi, frodo], [apeach, frodo], [frodo, neo], [muzi, neo], [apeach, muzi]]
setReportArray = setReportArray.map(reportedData => reportedData.split(' '));
setReportArray.map(reportedDataArray => {
// 신고당한 유저의 이름으로 id_list의 인덱스를 찾아 reportedUser의 해당 인덱스값 증가
// 각 유저당 받은 신고 횟수 ex) ["muni", "frodo", "apeach", "neo"] [1, 2, 0, 2]
reportedUser[id_list.indexOf(reportedDataArray[1])]++;
});
// 각 유저당 받은 메일 횟수
reportedUser.map((reportedNum, idx) => {
// 신고가 k번 이상이어야 메일을 받는다
if(reportedNum >= k) {
setReportArray.map(reportedDataArray => {
// 한 유저가 신고한 유저가 신고당한 횟수가 k번을 넘어 정지가 됐다면
if(reportedDataArray[1] === id_list[idx])
// 신고한 유저이름과 매칭되는 receivedMail의 해당 인덱스값 증가
// ex) ["muni", "frodo", "apeach", "neo"] [2, 1, 1, 0]
receivedMail[id_list.indexOf(reportedDataArray[0])]++;
})
}
});
return receivedMail;
}