카카오 문제라 그런지 생각보다 어려웠다
거의 반나절을 풀었는데 테스트케이스 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;
}
주석을 따로 안달아도 코드를 천천히 읽어보면 이해가 가능한 좋은 코드인것같다.
이번 문제는 완벽히 풀지 못했지만 하루이틀이 지나면 다시 풀어봐야겠다