728x90
INDEX
https://school.programmers.co.kr/learn/courses/30/lessons/92334
Solution
HashMap
구조를 활용해서 풀어야 할 것 같은 느낌이 듭니다.
우선 정답을 담을 Array
를 만듭니다.
let answer = new Array(id_list.length).fill(0);
신고당한 녀석이 아닌, 신고를 한 녀석이 받을 메일 개수를 카운트 할 배열입니다.
배열은 순서가 중요합니다. 예를들어 id_list
에 [muzi, frodo, apeach, neo]
가 들어왔다면 정답 array 또한
[muzi가 받을 메일 수, frodo가 받을 메일 수, ...] 가 되기 때문에
각 아이의 INDEX
를 저장할 Object
를 만듭니다.
let idxMap = {};
for (let i=0; i< id_list.length; i++){
idxMap[id_list[i]] = i;
}
idxMap
을 보면 아래와 같을겁니다.
{
"muzi" : 0,
"frodo" : 1,
"apeach" : 2,
"neo" : 3
}
굳이 MAP 으로 INDEX를 저장하는 이유는 Array 에서 각 아이의 INDEX를 찾기 위해서 또 불필요한 루프를 사용하게 되기 때문입니다.
이제는 신고를 당한 아이를 키 값으로 하고 신고를 한 아이의 INDEX
를 value
로 하는 MAP 구조를 만들겁니다.
첫 번째 예제대로 한다면 다음과 같은 구조가 되겠죠. 하지만 value 에 담을 때 Array 가 아닌 Set
구조로 담아야 합니다.
왜냐하면, 문제에서 신고자와 피신고자가 같으면 중복 인정하지 않겠다고 나와있기 때문입니다.
{
"frodo" : [0, 2], //muzi 와 apeach 가 신고했으므로
"neo" : [2, 1], // frodo 와 muzi 가 신고했으므로
"muzi" : [2] //apeach 가 신고했으므로
}
let reportedMap = {};
for (let i=0; i<report.length; i++){
const [reporter, reported] = report[i].split(' ');
if(reportedMap[reported]) reportedMap[reported].add(idxMap[reporter]);
else reportedMap[reported] = new Set([idxMap[reporter]]);
}
이제 reportedMap 을 순회하면서 value 의 길이가 k
보다 큰 경우에만 value 를 뽑아 answer 에 카운트해주면 됩니다.
for (const key of Object.keys(reportedMap)){
if(reportedMap[key].size>= k){
for (const idx of reportedMap[key]) answer[idx] += 1;
}
}
전체코드
function solution(id_list, report, k) {
let answer = new Array(id_list.length).fill(0);
let idxMap = {};
for (let i=0; i< id_list.length; i++){
idxMap[id_list[i]] = i;
}
let reportedMap = {};
for (let i=0; i<report.length; i++){
const [reporter, reported] = report[i].split(' ');
if(reportedMap[reported]) reportedMap[reported].add(idxMap[reporter]);
else reportedMap[reported] = new Set([idxMap[reporter]]);
}
for (const key of Object.keys(reportedMap)){
if(reportedMap[key].size>= k){
for (const idx of reportedMap[key]) answer[idx] += 1;
}
}
return answer;
}
'알고리즘 스터디' 카테고리의 다른 글
[Programmers] 요격 시스템 - Javascript (0) | 2023.09.30 |
---|---|
[Programmers] 카카오 인턴십키패드 누르기 - Javascript (0) | 2023.09.29 |
[Programmers] 기사단원의 무기 - Javascript (0) | 2023.09.24 |
2022 KAKAO TECH INTERNSHIP - 성격 유형 검사하기 (0) | 2023.09.13 |
2023 KAKAO BLIND RECRUITMENT-개인정보 수집 유효기간 (0) | 2023.09.13 |