N

(프로그래머스 KAKAO JS) 신고 결과 받기 본문

프로그래머스 알고리즘/KAKAO

(프로그래머스 KAKAO JS) 신고 결과 받기

naeunchan 2022. 2. 5. 12:52
728x90
반응형

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

 

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

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

programmers.co.kr

 

 

문자열과 map을 활용.

 

변수 설명

answer : 정답 배열

length : id_list의 길이

count : 유저가 신고를 받은 횟수 배열

reportedUser : 유저의 중복 신고 횟수를 방지하기 위한 map

idIndex : id_list에 있는 id의 인덱스 번호 저장 map

saveReportId : 각 유저가 신고한 유저를 저장하는 배열

 

우선 id_list에 있는 유저의 인덱스 번호를 idIndex map에 저장한다.

차례대로 저장하면 된다.

이 인덱스 번호를 이용해 saveReportId에 신고한 유저를 저장한다.

 

이후 report를 순회하여 신고 횟수를 저장한다.

report[i]에 있는 문자열을 공백을 기준으로 나눠 각각 [userId, targetId]로 저장한다.

만약 report[i] 문자열 자체가 reportedUser에 없다면 신고 이력이 없다는 뜻이 되기 때문에 카운팅을 진행한다.

 

카운팅은 count 맵에서 신고당한 유저의 횟수를 가져온다.

만약 undefined라면 최초 신고이기 때문에 0을 reportedCount에 저장한다.

또한, 신고한 유저(userId)의 인덱스 번호를 idIndex map에서 가져온다.

reportedUser map에서 신고한 케이스를 갱신하기 위해 report[i]를 키로 가지고, value는 true로 저장한다.

(이러면 중복 신고가 들어와도 if문에서 거르기 때문에 중복 신고 카운팅이 되지 않는다.)

신고 당한 유저의 카운팅도 1개 늘려주고,

saveReportId에 현재 유저가 어떤 유저를 신고했는지 알기 위해 targetId를 push하여 값을 저장한다.

 

report 이력 조회가 끝나면 신고한 유저가 k번 이상 신고받았는지 확인하면 된다.

result 는 현재 유저가 신고한 유저들이 정지를 받았는지 카운팅하는 변수다.

saveReportId의 순서가 userId의 순서기 때문에 이중 for문으로 신고한 유저 id의 카운팅이 

k번 이상인지 확인하여 result를 늘려주면 된다.

 

const solution = (id_list, report, k) => {
    const answer = [];
    const length = id_list.length;
    const count = new Map();
    const reportedUser = new Map();
    const idIndex = new Map();
    const saveReportId = Array.from({length}, () => []);
    
    for(let i = 0; i < length; i++){
        const id = id_list[i];
        
        idIndex.set(id, i);
    }
    
    for(let i = 0; i < report.length; i++){
        const [userId, targetId] = report[i].split(" ");
        
        if(!reportedUser.has(report[i])){
            const reportedCount = count.get(targetId) || 0;
            const userIdIndex = idIndex.get(userId);
            
            reportedUser.set(report[i], true);
            count.set(targetId, reportedCount + 1);
            saveReportId[userIdIndex].push(targetId);
        }
    }
    
    for(let i = 0; i < length; i++){
        let result = 0;
        
        for(let j = 0; j < saveReportId[i].length; j++){
            const targetId = saveReportId[i][j];
            
            if(count.get(targetId) >= k){
                result++;
            }
        }
        
        answer.push(result);
    }
    
    return answer;
}
728x90
반응형