끄적끄적

[Programmers] 신고 결과 받기 (JS) 본문

Programmers

[Programmers] 신고 결과 받기 (JS)

2024. 1. 22. 19:34

처음 문제를 보자마자 객체 하나로 싹 넣어서 하면 될 거같다는 생각이 왔다.

근데 마지막에 살짝 삐긋했던 것은 원하는 값은 정지당한 사람의 수가 아닌 

a가 [b,c,...]를 신고했을때 신고당한 사람들 중 정지를 당한 사람의 수의 배열이다.

 

풀이방식은 다음과 같다.

1. p라는 객체에 누가, 누구를 신고했는지 저장한다.

2. 신고내역을 하나씩 보며 p를 작성한다.

3. p를 보고 각 id당 신고당한 회수를 살펴보고 조건보다 많이 되어있는 정지당할 사람을 추출한다.

4. 정지당한 id를 신고한 id를 추출한다

p = {
 'id1': {
        'id2': 0,
        'id3': 0,
        'id4': 0
  },
  'id2': {...}
  ...
}

 

//solution

function solution(id_list, report, k) {
    var answer = [];
    let p = {}; 
    let reported = {}; // 각 id들이 신고당한 횟수를 기록하는 변수
    let reportedNames = []; // 정지당한 id를 기록하는 변수
    
    // p는 현재 유저들이 신고한 기록을 담은 object
    id_list.forEach(d => {
        p[d] = {};
        reported[d] = 0;
        answer[d] = 0;
        id_list.forEach(d2 => d!==d2 ? p[d][d2] = 0 : null)
    });
    
    // -------------------->
    // p = {
    //     'muzi': { frodo: 0, apeach: 0, frodo: 0, ...},
    //     'frodo': {...}
    // } 
    // 이런식으로 key 값의 사람이 각 사람을 신고한 횟수이다.
    
    
    // 신고내역을 하나씩 보며, 신고한 내역을 기록한다.
    report.forEach(d => {
        let a = d.split(' ')[0];
        let b = d.split(' ')[1];
        p[a][b] = 1;
    })
    
    // 기록된 신고내역으로 각 id들이 신고당한 횟수를 기록한다.
    id_list.forEach(d => {
        Object.keys(p[d]).forEach(d2 => {
            if(p[d][d2]){
                reported[d2]++;
                // 만약 k보다 신고회수가 많아지고 reportedNames에 현재 기록되어있지 않다면 추가한다.
                if(reported[d2] >= k && !reportedNames.includes(d2)) reportedNames.push(d2);
            }
        })
    })
    
    // 우리가 원하는 것은 누가 어떤이들을 신고했을때 그 사람이 정지당한 개수이다.
    for(let key in p){
        for(let key2 in p[key]){
            // key 가 key2를 신고한 회수가 1이상이고, 정지당한 목록에 포함되어있다면
            if(p[key][key2] >= 1 && reportedNames.includes(key2)){
                answer[key]++;
            }
        }
    }
    answer = Object.values(answer)
    
    return answer;
}
Comments