[프로그래머스] 신고 결과 받기 (Javascript)

잭슨·2024년 6월 6일
0

알고리즘 문제 풀이

목록 보기
115/130
post-thumbnail

문제

[프로그래머스] 신고 결과 받기

문제 정의

게시판을 이용하는 사용자들은 서로 신고할 수 있다.
신고 누적 횟수가 k번 이상일 경우 해당 사용자는 게시판 이용이 정지되고, 신고한 사용자들은 정지 사실을 메일로 받게된다.
한 사용자는 같은 사용자를 여러번 신고할 수 있으나, 1회만 신고된 것으로 처리된다.

사용자들의 ID와 누가 누구를 신고했는지가 주어졌을 때, 각각의 사용자들이 받을 메일의 개수를 배열로 반환하시오.

해결방안

풀이 1

그 전에 푼 가장 많이 받은 선물에서 2차원 배열을 이용해서 선물을 주고 받은 관계를 저장했던게 떠올랐다.

그래서 신고를 2차원 배열(관계형 테이블)로 만들어서 처리하는 것이 핵심 아이디어였다.
또한 2차원 배열을 사용하려면 문자열인 사용자ID를 인덱스에 매칭시켜야 했기 때문에 객체를 이용했다.

function solution(id_list, report, k) {
    const n = id_list.length
    const answer = Array(n).fill(0);
    const idIdx = {};
    id_list.forEach((id,i)=>idIdx[id] = i);
    const reportTable = Array.from(Array(n),()=>Array(n).fill(0));
    const totalReport = Array(n).fill(0);
    
    for(const data of report){
        const [from, to] = data.split(' ');
        const a = idIdx[from];
        const b = idIdx[to];
        // a가 b를 신고
        reportTable[a][b] = 1;
    }
    for(let i=0; i<n; i++){
        for(let j=0; j<n; j++){
            // j가 신고당한 횟수
            totalReport[j] += reportTable[i][j];
        }
    }
    
    for(let i=0; i<n; i++){
        // 신고 당한 횟수가 k보다 많은가?
        if(totalReport[i] >= k){
            for(let j=0; j<n; j++){
                // j가 i를 신고한 적이 있는가?
                if(reportTable[j][i]) answer[j]++;
            }
        }
    }
    
    return answer;
}

// 동일한 유저에 대한 신고 횟수는 1회로 처리
// 객체로 id와 인덱스 매칭

풀이 2

다른 사람들의 코드를 보고 수정해보았다.

function solution(id_list, report, k) {
    // Set을 이용해 중복되는 신고 제거
    const reports = [...new Set(report)].map(e=>e.split(' '));
    
    const reportCount = {};
    for(const [a, b] of reports){
        // a가 b를 신고
        reportCount[b] = reportCount[b] ? reportCount[b]+1 : 1;
    }
    
    const mailCount = {};
    for(const [a,b] of reports){
        // b의 신고 누적 횟수가 k번 이상이라면
        if(reportCount[b] >= k){
            mailCount[a] = mailCount[a] ? mailCount[a]+1 : 1;
        }
    }
    
    const answer = id_list.map(id=>mailCount[id] || 0);
    
    return answer;
}

Set을 이용해서 중복을 제거한다는 아이디어가 마음에 들었다. 또한 신고 누적횟수와 메일을 받는 횟수를 두 개의 객체로 나누어서 관리함으로써 코드의 가독성이 좋아진 것 또한 좋았다.

profile
지속적인 성장

0개의 댓글