ALGORITHM/Programmers + α

[프로그래머스] lv1. 신고 결과 받기 - JS

Harimad 2022. 3. 15. 23:42

문제

 

코딩테스트 연습 - 신고 결과 받기

문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의

programmers.co.kr

위의 문제를 참고


 

입출력 예

  id_list report  k result
1 ["muzi", "frodo", "apeach", "neo"] ["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"] 2 [2,1,1,0]
2 ["con", "ryan"] ["ryan con", "ryan con", "ryan con", "ryan con"] 3 [0,0]

2번 result가 [0,0]인 이유는

동일한 유저에 대한 신고 횟수는 1회로 처리 하기때문

 

입력값

id_list: 이용자의 id가 담긴 문자열 배열

report: 각 이용자가 신고한 이용자의 ID 정보가 담긴 문자열 배열

k: 정지 기준이 되는 신고 횟수

 

출력값

result: id_list에 담긴 id 순서대로 각 유저가 받은 결과 메일 수를 담은 배열

 

풀이

신고당한 유저의 수를 알아야하고

신고한 유저의 id를 알아야한다.

object의 key로 신고당한 유저의 id를 넣고, value로 신고한 유저의 id를 배열로 넣는다.

 

 

1. answer에 user 수만큼 0을 채워넣은 배열 생성

let answer = Array(id_list.length).fill(0);

//answer 값
// [5] [0, 0, 0, 0]

2. report_list 객체에 key로 user를 넣고 value로 빈배열을 넣는다.

id_list.map(user => report_list[user] = [])

//report_list 값
//(4) [{…}, {…}, {…}, {…}]
// 0: {muzi: Array(0)}
// 1: {frodo: Array(0)}
// 2: {apeach: Array(0)}
// 3: {neo: Array(0)}

3. report배열로 먼저 split으로 신고자와 신고당한자를 나눠 변수에 담는다.

4. report_list[receiver](신고당한자) 값에 동일한 신고자가 없다면 report_list[receiver]에 reporter를 배열에 push한다.

report.map(x => {
    const [reporter, receiver] = x.split(' ');
    if (!report_list[receiver].includes(reporter))
        report_list[receiver].push(reporter);
})

//report_list 값
// apeach: []
// frodo:  ['muzi', 'apeach']  <- k(2) 정지
// muzi:   ['apeach']
// neo:    ['frodo', 'muzi'] <- k(2) 정지

5. x는 report_list의 key값인 신고당한자 이고, report_list[x]는 신고자이다.

신고자의 길이가 k이상이면 신고자를 map함수로 answer배열에 값을 추가시킨다.

for (let x in report_list) {
    if (report_list[x].length >= k) {
        report_list[x].map(user => {
            answer[id_list.indexOf(user)] += 1;
        })
    }
}

//answer값
// [2, 1, 1, 0]

 

코드

function solution(id_list, report, k) {
    let report_list = {};
    let answer = Array(id_list.length).fill(0);  // 1

    id_list.map(user => report_list[user] = [])  // 2

    report.map(x => {
        const [reporter, receiver] = x.split(' ');  // 3
        if (!report_list[receiver].includes(reporter))  // 4
            report_list[receiver].push(reporter);
    })

    for (let x in report_list) {   // 5
        if (report_list[x].length >= k) {
            report_list[x].map(user => {
                answer[id_list.indexOf(user)] += 1;
            })
        }
    }
    return answer;
}

 

참고

 

코딩테스트 - 신고 결과 받기 JavaScript

신고 결과 받기 프로그래머스 Lv1 JS 문제 풀이

velog.io

https://devdocs.io/javascript/statements/for...in

 

DevDocs

 

devdocs.io