알고리즘 문제 풀기(프로그래머스)
https://github.com/hoinlee-moi/Algorithm
JS기본문법 다시 공부
https://github.com/hoinlee-moi/ModernJS
React 강의 듣기
https://github.com/hoinlee-moi/React_prac
알고리즘 1단계 마지막 클리어 했다.
풀긴 풀었는데 너무 비효율적이었고 생각을 완전히 뒤집는 계기가 된 것 같다.
진짜 이런 걸 볼때마다 한번씩 눈이 떠지는 것 같은데 많이 풀어보자
오늘 알고리즘
신고 결과 받기 - https://school.programmers.co.kr/learn/courses/30/lessons/92334
function solution(id_list, report, k) {
const reportList = new Map();
const mail = []
report.forEach(v=>{
let id = v.split(" ")[1]
let reportId = v.split(" ")[0]
reportList.set(id,(reportList.get(id)||"")+" "+reportId)
})
const reportListArr = [...reportList]
reportListArr.forEach(v=>{
const reportArr = v[1].split(" ")
const set = new Set(reportArr)
if(set.size-1>=k){
[...set].forEach(v=>v!=""?mail.push(v):false)
}
})
return id_list.map(v=>mail.filter(val=>val===v).length);
}
중복 값 제거를 어떻게 해야할까 고민하다가 한참이나 시간을 보냈다.
그리고 나중에 제거를 해보려고 했더니 정말 풀긴 풀었지만 너무 비효율적인 코드가 완성됐다
길을 건너기 위해 돌 하나씩 옮겨서 한칸 한칸 지나가는 느낌으로 풀어지는 경향이 많은데 주먹구구 식이 되니 꼭 주의하자
먼저 내 풀이 방식이다.
id마다 누구누구에게 신고 받았는지 알기 위해 Map객체를 만들었고 추후 메일을 보낼 사람들을 알기 위해 따로 mail이란 배열을 만들었다report를 반복해 map에 누가 신고 당했는지와 신고한 사람이 누구인지 체크했다.Set으로 제거하고 제거한 값의 개수가 k의 수를 넘어가면 mail배열에 집어넣는다.id_list배열의 값이 mail배열에서 총 몇개있는지 검사하여 return아래는 처음부터 중복값을 제거하여 훨씬 더 쉬웠다.
위에서 풀 때 mail을 배열이 아니라 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;
}
Set을 이용해 중복값을 없엔 배열을 다시 스프레드연산자를 이용하여 배열로 바꾸고 map을 이용해 2차원배열로 변경한다.counts를 Map객체로 선언reports를 반복문을 이용해 어떤 사람이 몇표의 신고를 받았는지 체크한다.good이란 Map객체를 만들고reports를 반복시켜 counts에서 신고받은 사람의 신고개수가 몇개인지 확인 k번보다 많다면 good객체에 넣고 메일 보낼 개수를 더한다.id_list를 map으로 돌며 good객체에서 메일을 몇개 받는지 확인 없으면 0으로 체크하여 return한다.