http://// https://school.programmers.co.kr/learn/courses/30/lessons/92334
서론 : 프로젝트를 진행중이어서, 꾸준히 문제 푸는건 부담감을 느끼고 있지만,, 그래도 아예 안풀면 많이 까먹는 것 같아서 시간을 내어 문제를 풀었습니다.
개인적으로 자바스크립트에서 Map과 Set을 잘 활용하지 못한다고 생각해서 해당 문제를 포스팅하게 되었습니다.
우선 제가 푼 방식은
function solution(id_list, report, k) {
const uniqueReport = Array.from(new Set(report));
const memberCount = id_list.length; // 참여자수
const uniqueReportCount = uniqueReport.length; // 중복없는 신고수
const answer = Array(memberCount).fill(0);
const nameIndex = {};
// 이름을 인덱스 값으로 바꿔줄 객체 생성)
for (let i = 0; i < id_list.length; i++) {
nameIndex[id_list[i]] = i;
}
const reporterList = [];
// 각각의 피신고자에 대한 신고자를 기록하는 배열 빈칸
for (let i = 0; i < memberCount; i++) {
reporterList.push([]);
}
// 신고자를 기록하기
for (let i = 0; i < uniqueReportCount; i++) {
const [reporter, reportee] = uniqueReport[i].split(' ');
// console.log(reporter, reportee);
reporterList[nameIndex[reportee]].push(reporter);
}
// 신고대상을 분석하여 신고자가 k보다 많은 경우만 신고자에게 메일전송(answer배열값 증가)
for (let i = 0; i < reporterList.length; i++) {
if (reporterList[i].length >= k) {
for (let j = 0; j < reporterList[i].length; j++) {
answer[nameIndex[reporterList[i][j]]]++;
}
}
}
return answer;
}
1 .그간 경험으로 set과 map이 중복을 제거할 때 굉장히 용이하다고 생각을 하고 있었습니다. 따라서 우선 중복신고를 없애라는 가이드라인에 따라서 set을 통해서 uniqueReport를 만들었습니다.
2. 피신고자와 신고자를 구분하여 피신고자가 각각의 신고자를 기록하게 만들었습니다.
3. 이후 신고자의 숫자가 k이상이라 재제받는 경우만 anwer배열의 값을 증가시켜서 리턴했습니다.
이 과정에서 미리 nameIndex를 뽑는다던가,, anwer을 미리 0이 담긴 배열로 채우기, 등등 과정이 굉장히 길어졌다고 느꼈습니다.
우선 성능차이입니다.. 공간복잡도 뿐만 아니라 시간복잡도 면에서도 많이 뒤쳐졌네요 ㅠ

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;
}
우선 저는 중복되는 신고값을 제거하는 과정에서 미리 신고자와 피신고자를 나눴네요.
이후에 Map 객체에 각각 bad (신고 횟수 ) . good(신고 성공한 횟수) 를 기록합니다.
이때 get메서드를 통하여서 만약 해당 신고자 혹은 피신고자가 존재한다면 +1 없으면 undefined인 값을 1로 변경해줍니다.
이후에 id_list에 대해서 map 메서드를 통해서 신고에 성공한 횟수를 기록해줍니다. 이때도 마찬가지로 존재 하지 않으면 undefined이기 떄문에 || 0 을 통해서 없는 경우 0을 할당해줍니다.
Map을 이용하니 키 벨류형식이라 가독성도 좋아지네요..
'알고리즘 문제풀이' 카테고리의 다른 글
9466 텀 프로젝트 (Node.js) (0) | 2023.11.17 |
---|---|
백준 2842 집배원 한상덕 코드 리뷰 (node.js) (0) | 2023.11.08 |
Node.js) 백분 1016 제곱 ㄴㄴ 수 (1) | 2023.10.30 |
나머지가 1이 되는 수 찾기 문제 최적화(에란토스체) (0) | 2023.08.19 |
소수찾기(에라토네스 체) 프로그래머스 (0) | 2023.07.11 |