(Array.prototype.map()말고) 과거에 map을 공부한 나이지만
https://velog.io/@jasmine0714/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-0%EB%A0%88%EB%B2%A8-%EC%B5%9C%EB%B9%88%EA%B0%92-%EA%B5%AC%ED%95%98%EA%B8%B0
여전히 map이랑은 어색한 사이다.
빈도수를 구할 때는 reduce로 객체 구하는 데에 더 손이 간다.
일단 나의 코드
function solution(id_list, report, k) {
const eachOther = [...new Set(report)].map((v)=> v.split(" "));
let arr = [];
for (let v of id_list) eachOther.filter((w)=> w[1] === v).length >= k ? arr.push(eachOther.filter((w)=> w[1] === v)) : null;
const reporters = arr.flat().map((v)=>v[0]);
const obj = reporters.reduce((acc,cur)=>{
acc[cur] ? acc[cur]++ : acc[cur] = 1;
return acc;
},{})
let ans = [];
for (let v of id_list ) obj[v] ? ans.push(obj[v]) : ans.push(0);
return ans;
}
Set으로 중복 제거부터하고 시작~
신고 결과가 2번 이상이어도 의미가 없으므로 중복 제거 안하고 시작하면 정신머리가 사납다 ㅋㅋㅋ
eachOther에는 신고자와 신고받은자가 2차원 배열로 들어있다.
그리고 id_list를 for of 문으로 돌며, eachOther에서 신고받은자가 k번 이상 출몰할 경우(filter 사용)만 새로운 arr에 push해주었다.
그리고 arr에서 신고자들만 추려서 reporters라는 변수에 저장.
그리고 reporters의 각 원소에 대해 reduce를 이용하여 빈도수를 구하는 객체 Obj 생성.
그런데 Obj에는 메일 받은 횟수가 0인 사람은 나오지 않으므로, id_list 명단을 for of 문으로 돌면서 객체의 value를 (메일 못 받은 사람은 0을) push해준다.
그리고 안 써 버릇하니 어색한 map과도 좀 더 친해지기 위해 map을 활용한 코드도 가져와봤다.
function solution(id_list, report, k) {
let reports = [...new Set(report)].map(a=>{return a.split(' ')});
let counts = new Map();
for (const bad of reports){
counts.set(bad[1],counts.get(bad[1])+1||1)
}
let good = new Map();
for(const report of reports){
if(counts.get(report[1])>=k){
good.set(report[0],good.get(report[0])+1||1)
}
}
let answer = id_list.map(a=>good.get(a)||0)
return answer;
}
내가 eachOther이라는 변수에 저장한 첫줄까지는 풀이가 같다. (중복 제거 후 2차원 배열로 보관.)
그리고 map에 신고당한 사람들의 이름을 key로, 신고당한 횟수를 value로 저장한다.
신고당한 빈도수가 k번 이상 이면 good이라는 새로운 map에 신고한 사람과 신고한 빈도수를 각각 key와 value로 저장.
마지막으로 id_list를 Array.prototype.map()을 활용하여 신고한 횟수로 반환하고 신고 횟수가 0이면 0을 반환.
빈도수 구할 때 reduce랑 객체만 쓰지 말고 map도 연습 삼아 조금씩 활용해보자!