알고리즘 문제 풀기(프로그래머스)
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
한다.