알고리즘 문제풀이

프로그래머스 level 1 - 신고 결과 받기(Javascript)

승큐니 2023. 11. 7. 20:46

신고 결과 받기

배운 것, 유의할 것

객체를 사용한 문제 풀이

문제 자체는 이해안되는 점도, 구현의 어려운 점도 없었다. 객체를 사용해서 풀어서 뿌듯

배열에서 중복 값 삭제

const array = [1, 2, 3, 3, 4, 4, 5];
const set = new Set(array);
const newArray = [...set]

객체에서 값만 뽑아 배열로

const obj = {
	a:1,
	b:2,
	c:3,
	d:4,
}
Object.valuse(obj) // [1, 2, 3, 4]

정답코드

function solution(id_list, report, k) {
    // 유저가 받은 결과 메일 수
    var answer = [];
    // 동일인이 같은 유저를 여러번 신고해도 중복되지 않으므로 중복 제거
    report = new Set(report);
    report = [...report]
    
    // 신고한 유저를 키값으로 신고당한 유저를 배열로 갖는 객체
    const keyReporter = {};
    // 유저별 신고당한 횟수를 나타내는 객체
    const keyReported = {}
    // 유저별 결과 메일 받을 수를 나타내는 객체
    const userReportedCount = {};
    
    // 각 객체별로 키와 기본값을 생성해줌
    for(let i = 0; i < id_list.length; i++){
        keyReporter[id_list[i]] = [];
        keyReported[id_list[i]] = 0;
        userReportedCount[id_list[i]] = 0;
    }
    
    // 신고현황 자료를 통해 신고한 사람이 누구를 신고했는지, 신고당한 유저의 횟수 증가
    report.forEach(v=>{
        v = v.split(' ')

        keyReporter[v[0]].push(v[1])
        keyReported[v[1]] += 1;
    })
    
    // 신고당한 횟수를 나타내는 객체를 순회하며 k번 이상인 경우 정지먹는 유저를 배열에 보관
    const suspendedUsers = [];
    for(let i = 0; i <id_list.length; i++){
        if(keyReported[id_list[i]] >= k){
            suspendedUsers.push(id_list[i])
        }
    }
    
    // 각 유저별로 
    for(let i = 0; i < id_list.length; i++){
        // 받을 결과 메일의 수 
        let count = 0;
        // 신고한 유저중에 정지된 유저가 있으면 받을 결과 메일의 수++
        for(let j = 0; j < suspendedUsers.length; j++){
            if(keyReporter[id_list[i]].includes(suspendedUsers[j])){
                count++
            }
        }
        // 유저가 통보받는 횟수 값 설정
        userReportedCount[id_list[i]] += count
    }

    // 객체에서 값만 뽑아 배열로 생성
    answer = Object.values(userReportedCount);
    // 정답 반환
    return answer;
}