TIL 20221215 - 161번

hoin_lee·2022년 12월 15일
0

TIL

목록 보기
126/236

오늘 공부

알고리즘 문제 풀기(프로그래머스)
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차원배열로 변경한다.
  • 신고 숫자를 확인할 countsMap객체로 선언
  • 앞에서 할당한 2차원 배열인 reports를 반복문을 이용해 어떤 사람이 몇표의 신고를 받았는지 체크한다.
  • 이후 신고자를 체크할 good이란 Map객체를 만들고
  • 다시 reports를 반복시켜 counts에서 신고받은 사람의 신고개수가 몇개인지 확인 k번보다 많다면 good객체에 넣고 메일 보낼 개수를 더한다.
  • 마지막으로 id_listmap으로 돌며 good객체에서 메일을 몇개 받는지 확인 없으면 0으로 체크하여 return한다.
profile
https://mo-i-programmers.tistory.com/

0개의 댓글