본문 바로가기

알고리즘 스터디

[Programmers] 2022 KAKAO BLIND RECRUITMENT신고 결과 받기 - Javascript

728x90

INDEX

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

     

    프로그래머스

    코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

    programmers.co.kr

     

    Solution

    HashMap 구조를 활용해서 풀어야 할 것 같은 느낌이 듭니다.

     

    우선 정답을 담을 Array 를 만듭니다.

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

    신고당한 녀석이 아닌, 신고를 한 녀석이 받을 메일 개수를 카운트 할 배열입니다.

    배열은 순서가 중요합니다. 예를들어 id_list[muzi, frodo, apeach, neo] 가 들어왔다면 정답 array 또한 

    [muzi가 받을 메일 수, frodo가 받을 메일 수, ...] 가 되기 때문에

    각 아이의 INDEX 를 저장할 Object 를 만듭니다.

    let idxMap = {};
    for (let i=0; i< id_list.length; i++){
        idxMap[id_list[i]] = i;
    }

    idxMap 을 보면 아래와 같을겁니다.

    {
       "muzi" : 0,
       "frodo" : 1,
       "apeach" : 2,
       "neo" : 3
    }

    굳이 MAP 으로 INDEX를 저장하는 이유는 Array 에서 각 아이의 INDEX를 찾기 위해서 또 불필요한 루프를 사용하게 되기 때문입니다.

     

    이제는 신고를 당한 아이를 키 값으로 하고 신고를 한 아이의 INDEXvalue 로 하는 MAP 구조를 만들겁니다.

    첫 번째 예제대로 한다면 다음과 같은 구조가 되겠죠. 하지만 value 에 담을 때 Array 가 아닌 Set 구조로 담아야 합니다.

    왜냐하면, 문제에서 신고자와 피신고자가 같으면 중복 인정하지 않겠다고 나와있기 때문입니다.

    {
        "frodo" 	: [0, 2], //muzi 와 apeach 가 신고했으므로 
        "neo" 		: [2, 1], // frodo 와 muzi 가 신고했으므로
        "muzi" 		: [2] //apeach 가 신고했으므로
    }
    let reportedMap = {};
    for (let i=0; i<report.length; i++){
        const [reporter, reported] = report[i].split(' ');
        if(reportedMap[reported]) reportedMap[reported].add(idxMap[reporter]);
        else reportedMap[reported] = new Set([idxMap[reporter]]);
    }

     

    이제 reportedMap 을 순회하면서 value 의 길이가 k 보다 큰 경우에만 value 를 뽑아 answer 에 카운트해주면 됩니다.

    for (const key of Object.keys(reportedMap)){
        if(reportedMap[key].size>= k){
            for (const idx of reportedMap[key]) answer[idx] += 1;
        }
    }

    전체코드

    function solution(id_list, report, k) {
        let answer = new Array(id_list.length).fill(0);
        let idxMap = {};
        for (let i=0; i< id_list.length; i++){
            idxMap[id_list[i]] = i;
        }
        let reportedMap = {};
        for (let i=0; i<report.length; i++){
            const [reporter, reported] = report[i].split(' ');
            if(reportedMap[reported]) reportedMap[reported].add(idxMap[reporter]);
            else reportedMap[reported] = new Set([idxMap[reporter]]);
        }
        for (const key of Object.keys(reportedMap)){
            if(reportedMap[key].size>= k){
                for (const idx of reportedMap[key]) answer[idx] += 1;
            }
        }
        return answer;
    }