-
신고 결과 받기알고리즘/Level 1 2022. 8. 19. 17:33
https://school.programmers.co.kr/learn/courses/30/lessons/92334
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
접근 방법
문제 설명을 읽으면서 내가 중요하다고 생각된 내용은 아래와 같다.
-
한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리한다.
배열속에 중복된 문자열을 모두 없애서 배열의 길이를 단축시켜야 겠다고 생각했다. -
유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다.
정지 메일을 받기 위해서는 내가 누구를 신고했는지 알고있어야 하기 때문에 객체를 통해서 신고에 관련된 정보를 갖고있어야 겠다고 생각했다.
function solution(id_list, report, k) { const answer = []; const list = new Object(); id_list.forEach((item) => { list[item] = { // 신고 받은 횟수, 받아야 할 메일, 본인을 신고한 아이디의 정보 count: 0, mail: 0, id: [], }; }); }
먼저 list 라는 빈 객체를 생성해준 뒤 id_list에 있는 각각의 ID에 신고를 받은 회수, 받아야 할 메일 수 그리고 본인을 신고한 아이디를 갖는 객체를 생성해주었다.
function solution(id_list, report, k){ // 코드는 위와 동일 const setReport = new Set(report); setReport.forEach((item) => { let account = item.split(" "); list[account[1]].id.push(account[0]); list[account[1]].count++; }); }
이후 Set의 특징을 사용하여 report 배열 속 중복된 문자열을 모두 지워준 뒤 새로운 객체를 생성을 했다.
그리고 각각의 객체를 방문하여 공백을 기준으로 신고한 ID와 신고를 당한 ID를 구분하여 미리 생성해 둔 list 객체에 접근하여 신고를 한 ID를 배열속에 삽입한 뒤 신고 횟수를 증가시켜줬다.function solution(id_list, report, k) { // 코드는 위와 동일 Object.values(list).map((item) => { if (item.count >= k) { item.id.forEach((item) => list[item].mail++); } }); Object.values(list).map((item) => { return answer.push(item.mail); }); return answer; }
이제 list 객체를 돌면서 신고횟수가 k 이상인 ID가 존재한다면 본인을 신고한 ID를 Key값으로 설정해 해당 Key값을 갖는 Value의 mail 수를 1증가 시켜주었다.
그 뒤 list 객체를 돌면서 각각의 객체가 갖는 메일 수를 answer 배열에 삽입 한 뒤 반환해주었다.
모범 답안
더보기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; }
느낀점
지금 이 글을 적으면서 맨 처음으로 든 생각이 왜 느린 forEach를 사용했을 까 for..of가 존재하는데 라는 생각이 먼저 들었다.
그래서 살짝 조작을 해서 글을 적을까 생각을 해보았지만 그냥 작성하기로 했다.
(이렇게 기록으로 남겨놔야지 내가 앞으로 실수를 않할 것 같다고 생각이 든다.)
또한 코드 뒤쪽 부분은 문제를 풀면서도 아 이렇게 하면 안되는데 라는 생각을 계속 갖고 있었지만 어떻게 해야 효율적인 코드가 나오는지 전혀 떠오르지 않았다.
모범 답안과 같이 깔끔한 코드를 보면 감탄한 뒤 나를 돌아보게 된다.
하지만 언젠간 나도 저렇게 깔끔한 코드를 작성할 수 있다고 생각하기 때문에 오늘보다 내일 더 노력할 것이다:)
-