단단히 잘못된 나의 코드 무엇이 문제인가
function solution(id_list, report, k) {
const map1 = new Map();
const map2 = new Map();
// 중복 신고 제거
const new_report = [];
report.map((r) => !new_report.includes(r) && new_report.push(r));
// Map 만들기
id_list.map((id) => map1.set(id, 0));
id_list.map((id) => map2.set(id, 0));
// 유저별 신고 누적 수 카운트
new_report.map((r) => {
const reported = r.split(' ')[1];
const amount = map1.get(reported)
map1.set(reported, amount + 1);
})
// 게시판 정지 대상 유저 찾기
const temp = [];
id_list.map((id) => map1.get(id) === k && temp.push(id));
// 문제가 있었던 부분! 연산자를 >=로 바꾸어주었어야 했다.
// 정지 유저 신고자 찾기
new_report.map((r) => {
const reporter = r.split(' ')[0];
const reported = r.split(' ')[1];
const amount = map2.get(reporter);
if (temp.includes(reported)) {
map2.set(reporter, amount + 1);
};
})
// 정지 유저 신고자별 횟수
const map2Iter = map2.values()
const answer = [];
for (let i = 0; i < id_list.length; i++) {
answer.push(map2Iter.next().value);
}
return answer;
}
우선 Map 객체로 접근한 것까지는 좋은 시도였던 것으로 보여진다. 다른 풀이들도 Map객체를 이용해서 키, 밸류 값을 저장하고 있다. 그리고 아예 다른 풀이를 참고해서 새 코드를 짜던 중 문제를 발견했다. 인수로 받아온 k값 '이상'의 값을 갖는 요소에 대해 정지 처리를 해야 되는데 '===' 일치 연산자로 처리하고 있었으니 당연히 안 되는 게 뻔함. 후, 아무튼 해결했으나 너무 케이스가 많은 경우에는 시간 초과를 불러일으키고 있어서 새 풀이로 다시 작성했다. 새 풀이는 아래와 같다.
Set을 쓸 생각을 못 하고 있었어서 딥다이브 37장 공부한 후에 새로 써보았다. 덕분에 쉽게 중복 제거 처리를 할 수 있었고 Map도 좀 더 간결하게 써보았음.
function solution(id_list, report, k) {
const reports = [...new Set(report)].map(r => r.split(' '));
const reported = new Map();
for (const r of reports) reported.set(r[1], reported.get(r[1]) + 1 || 1);
const reporter = new Map();
for (const r of reports)
reported.get(r[1]) >= k && reporter.set(r[0], reporter.get(r[0]) + 1 || 1);
const answer = id_list.map(id => reporter.get(id) || 0);
return answer;
}