[Javascript] 신고 결과 받기

bjyyyyy·2022년 7월 20일

문제 링크

카카오 문제라 그런지 생각보다 어려웠다
거의 반나절을 풀었는데 테스트케이스 6개가 시간초과가 나왔다.

해당 코드

function solution(id_list, report, k) {
    // 배열 중복 제거
    let deduplicatedUser = [...new Set(report)];
    let result = [];
    let reported = [];
    let reporter = {};

    // 신고결과 카운트
    for (let id of id_list) {
        reporter[`${id}`] = 0;
    }

    // 신고받은 이용자 분리
    for (let user of deduplicatedUser) {
        reported.push(user.split(" ")[1]);
    }

    // 이용자 신고받은 횟수
    let setReported = reported.reduce((pv, cv) => {
        pv[cv] = (pv[cv] || 0) + 1;
        return pv;
    }, {});

    // 신고당한 이용자가 정지기준인 k보다 높으면 1 추가
    for (let user of deduplicatedUser) {
        if (
            Object.keys(setReported).includes(user.split(" ")[1]) &&
            setReported[`${user.split(" ")[1]}`] >= k
        ) {
            reporter[`${user.split(" ")[0]}`] += 1;
        }
        result = Object.values(reporter);
    }

    return result;
}

애초에 접근법이 잘못됬던것같다.
for문이 너무 많아 id_list와 report의 길이가 늘어나면 속도가 현저히 느려졌다.
최대한 코드를 깎아봤으나 더 나은 방법이 생각 안나서 찾아보니 엄청 깔끔하게 잘 푼 코드가 있었다.

function solution(id_list, report, k) {
    // 배열 중복 제거
    const deduplicatedUser = [...new Set(report)];
    const banList = [];
    const reportedCount = Array(id_list.length).fill(0);
    const mailCount = Array(id_list.length).fill(0);

    for (let id of deduplicatedUser) {
        let reporter = id.split(" ")[0];
        let reported = id.split(" ")[1];
        let findReported = id_list.indexOf(reported);
        reportedCount[findReported] += 1;

        if (reportedCount[findReported] >= k) {
            banList.push(id_list[findReported]);
        }
    }

    deduplicatedUser.map((user, i) => {
        let reporter = user.split(" ")[0];
        let reported = user.split(" ")[1];
        if (banList.indexOf(reported) >= 0) {
            let reporterId = id_list.indexOf(reporter);
            mailCount[reporterId] += 1;
        }
    });

    return mailCount;
}

주석을 따로 안달아도 코드를 천천히 읽어보면 이해가 가능한 좋은 코드인것같다.

이번 문제는 완벽히 풀지 못했지만 하루이틀이 지나면 다시 풀어봐야겠다

0개의 댓글