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;
}