ericagong / algorithm_solving

2 stars 0 forks source link

[구현] 신고 결과 받기 #70

Open ericagong opened 1 year ago

ericagong commented 1 year ago

⭐ 성찰

  1. Map.prototype.set(key, map.get(key) + 1 || 1) 처리하는 경우, map.get(key)가 없으면 undefined를 반환하므로 + 연산 시, NaN으로 변환되고, 따라서 || 연산에서 1이 반환됨.
  2. 중복 제거가 필요한 경우 Set을 사용하고, 다시 spread 연산자로 배열로 변환 ㄴ let reports = [...new Set(report)].map((a) => { return a.split(" "); });

❓ 문제 상황

신고 결과 받기

👨‍💻 문제 해결

✅ 1차 풀이: map을 통한 카운팅

  1. 유저 A -> B로의 신고가 한 번만 신고 가능하므로 Set으로 중복 제거한 배열 생성
  2. key = 신고 당한 유저 value = 신고당한 횟수로 갖는 map 생성해, 유저별 신고 당한 횟수 카운팅
  3. key = 신고한 유저 value = 신고한 횟수로 갖는 map 생성해, 유저별 메일 받은 횟수 카운팅
  4. 유저가 받은 메일 수 반환
    
    // https://school.programmers.co.kr/learn/courses/30/lessons/92334

function solution(id_list, report, k) { // 유저 A -> B로의 신고가 한 번만 신고 가능하므로 Set으로 중복 제거 let reports = [...new Set(report)].map((a) => { return a.split(" "); });

let reported = new Map(); // key = 신고 당한 유저 value = 신고당한 횟수 for (const report of reports) { reported.set(report[1], reported.get(report[1]) + 1 || 1); }

let reporting = new Map(); // key = 신고한 유저 value = 신고한 횟수 for (const report of reports) { if (reported.get(report[1]) >= k) { reporting.set(report[0], reporting.get(report[0]) + 1 || 1); } }

// 유저가 받은 메일 수 반환 let answer = id_list.map((a) => reporting.get(a) || 0); return answer; }