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

이나리·2023년 2월 13일
0

문제

https://school.programmers.co.kr/learn/courses/30/lessons/92334

입출력 예시

id_listreportkresult
["muzi", "frodo", "apeach", "neo"]["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"]2[2,1,1,0]
["con", "ryan"]["ryan con", "ryan con", "ryan con", "ryan con"]3[0,0]

풀이

function solution(id_list, report, k) {
    const id_obj = id_list.reduce((acc, id) => {
        acc[id] = [];
        return acc;
    }, {});
    const report_obj = report.reduce((acc, curr) => {
        const [reporter, reportedIds] = curr.split(' ');
        if (!acc[reporter].includes(reportedIds)) {
            acc[reporter].push(reportedIds);
        }   
        return acc;
    }, id_obj);
    const reportedId_list = id_list.reduce((acc, id) => {
        acc.push(...report_obj[id]);
        return acc;
    }, []);
    const reportedCount_obj = reportedId_list.reduce((acc, id) => {
        if (acc[id] === undefined) {
            acc[id] = 0;
        }
        acc[id] += 1;
        return acc;
    }, {});
    const bannedId_list = id_list.filter(id => reportedCount_obj[id] >= k);

    return Object.values(report_obj).map(reportedIds => {
        return reportedIds.filter(id => bannedId_list.includes(id)).length;
    });
}

풀이 해석

  1. 빈 객체에 각 유저의 이름을 키로 하여, 해당 유저가 신고한 유저 목록을 갖는 객체 report_obj 를 새로 만든다.
    이때, 동일 유저에 대한 신고는 1번만 가능하므로, 이미 신고 목록에 신고할 유저의 이름이 있는 경우 목록에 추가하지 않는다.
const report_obj = {
	muzi: ['frodo', 'neo'],
  	apeach: ['frodo', 'muzi'],
  	frodo: ['neo'],
 	neo: [],
};
  1. 1에서 만든 report_obj 객체에서 각 키 값은 각 유저마다 신고한 다른 유저 목록을 가리킨다. 이 목록을 하나로 합치면, 전체 신고 유저 목록이 되고, 각 유저별로 신고된 횟수를 카운팅할 수 있음 => reportedCount_obj
const reportedCount_obj = {
	muzi: 1,
  	apeach: 0,
  	frodo: 2,
  	neo: 1,
};
  1. 2에서 유저별로 신고된 횟수를 카운팅했으므로, k번 이상 신고된 유저, 즉 정지해야 하는 유저 목록을 만들어야 한다.
    전체 유저 목록 id_list 를 대상으로, 정지시켜야 하는 유저 목록 bannedId_list 를 추출한다.

  2. report_obj 객체의 각 키 값, 즉 각 유저의 신고 유저 목록에 대해 정지 유저에 해당하는 유저를 필터링한 후, 그 개수를 가져온다.

0개의 댓글