2차 공부/알고리즘

신고 결과 받기

공대탈출 2024. 7. 4. 16:27

프로그래머스 - 신고 결과 받기

id순서배열과 신고내역 배열, 정지기준이 인자로 들어오고, 피신고인의 피신고량이 정지기준을 넘기면 신고자에게 신고결과메일을 발송한다.

이때 모든 id_list에 대한 신고결과메일 발송량을 리턴하면 된다.

 

function solution(id_list, report, k) {
    var answer = [];
    //누가 누구들을 신고했는지에 대한 배열
    let reportArr = {}
    //누가 누구들에게 의해서 신고당했는지에 대한 배열
    let reportedArr = {}
    //각 id마다 신고, 피신고 배열을 만들어 객체에 넣어줌
    id_list.forEach((id) => {
        reportArr[id] = []
        reportedArr[id] = []
    })
    //신고목록에 대한 반복 판별문
    for (const submit of report) {
        //신고자, 피신고자 구조분해할당
        let [reportUserId, reportedUserId] = submit.split(' ')
        //신고자가 이미 피신고인의 배열안에 있는지에 대한 flag
        let flag = true;
        //피신고자 배열의 해당인원 배열탐색
        for (let i = 0; i<reportedArr[reportedUserId].length; i++) {
            //신고인이 해당 반복의 이름과 같지 않다면 다음이름 탐색
            if (reportUserId !== reportedArr[reportedUserId][i]) {
                continue
            } else {
                //신고인이 해당 반복의 이름과 같다면 flag를 false로
                flag = false;
                break;
            }
        }
        //만약 신고인이 피신고인 배열에 포함되어있지 않다면, 신고인을 피신고인 배열에 넣는다.
        if (flag) reportedArr[reportedUserId].push(reportUserId);
        //만약 피신고인이 신고인의 배열에 포함되어있지 않다면, 피신고인을 신고인 배열에 넣는다.
        if (flag) reportArr[reportUserId].push(reportedUserId)
    }
    //각 신고자마다의 결과메일개수를 담아줄 객체를 생성해준다.
    let successfulBan = {}
    id_list.forEach((id) => successfulBan[id] = 0)
    //신고, 피신고객체의 순서 및 길이는 id_list와 같기때문에 id_list 기준으로 반복문 실행
    for (const id of id_list) {
        //만약 신고개수가 정지기준이상이라면
        if (reportedArr[id].length >= k) {
            //피신고자객체에서 해당 id값의 신고자목록을 탐색한다.
            for (let j = 0; j<reportedArr[id].length; j++) {
                //신고결과메일객체에서 신고자의 값에 1을 더해준다.
                successfulBan[reportedArr[id][j]] = successfulBan[reportedArr[id][j]] + 1
            }
        }
    }
    for (const id of id_list) {
        //신고결과메일객체 앞에서부터 순서대로 answer에 push해준다.
        answer.push(successfulBan[id])
    }
    //신고결과값이 담긴 배열 answer을 리턴
    return answer;
}

깔끔하게 통과되었다. 이전 알고리즘 문제에서 includes를 사용했을 때 런타임에러가 발생해서 이번엔 완벽히 반복문으로 수행했다.

 

다만, 신고내역에서 중복을 거르는 부분이 조금 걸리긴 한다.

let realReportList = new Set(report)

Set을 사용하면 중복값을 쉽게 제거할 수 있어 다음에 중복을 걸러야 할 때에는 Set을 생각해보도록 하자.


알고리즘을 풀이하며 객체를 생성하기 쉬운 Map을 주로 사용했었다.

하지만 Map의 값을 조정하는데는 메서드의 이용이 필수불가결하여 객체를 주로 사용해보고자 한다.

그리고 오늘 객체의 값에 배열을 넣어 접근 후 반복문 사용을 하려고 했으나 오류가 발생했었다.

직접적으로 객체에 forEach를 사용했기 때문이다.

객체는 for문이나 for of를 사용하여 객체의 특정키값에 접근하도록 하자.

'2차 공부 > 알고리즘' 카테고리의 다른 글

JadenCase 문자열 만들기  (0) 2024.07.08
최댓값과 최소값  (0) 2024.07.05
공원 산책  (0) 2024.07.03
달리기 경주  (0) 2024.07.02
개인정보 수집 유효기간  (0) 2024.07.01