문제
코딩테스트 연습 - 신고 결과 받기 | 프로그래머스 (programmers.co.kr)
1. 나의 풀이
function solution(id_list, report, k) {
var answer = [];
//report 이용자 신고자 구분
let report_split = []
report.forEach((val)=>{
let arr = val.split(' ')
report_split.push(arr)
})
//중복 예외 처리
const setReport = [...new Set(report_split.join('|').split('|'))].map(val=>val.split(
','));
//신고당한 횟수
let numReport=[]
id_list.forEach((id)=> {numReport.push([id,setReport.filter(val => val[1] === id).length])})
let lastReport = numReport.filter(val=> val[1] >= k);
//정지 메일 횟수
id_list.forEach((id)=>{
let numStop = 0
setReport.forEach((setId)=>{
lastReport.forEach((stopId)=>{
if(id === setId[0]){
if(stopId[0] === setId[1])
numStop += 1;
}
})
})
answer.push(numStop);
})
return answer;
}
테스트 케이스 중 시간초과 발생...
filter와 forEach를 너무 많이 사용해서 풀었기 때문에 사실 예상은 했다.
아직 시간복잡도까지는 고려하지 못하지만 그래도 혼자 힘으로 정답을 맞췄다는 것에 만족한다.
2. 정답풀이
function solution(id_list, report, k) {
const userList = id_list.reduce((result, currentId) => {
result[currentId] = [0, []];
return result;
}, {});
for (const id of new Set(report)) {
const [REPORT_ID, ID] = id.split(' ');
userList[REPORT_ID][1].push(ID);
userList[ID][0]++;
}
const banned = id_list.filter((id) => userList[id][0] >= k);
const emailList = id_list.map((id) => {
return userList[id][1].filter((id) => {
return banned.includes(id);
}).length;
});
return emailList;
}
깔끔... 똑같이 filter map forEach 등을 사용해 풀었지만 시간복잡도 및 클린코드로 작성되었다.
다양한 문제를 더 풀면서 시간복잡도도 계산할 수 있도록 노력해야겠다.
이제 프로그래머스 1단계는 모두 풀었다.
앞으로는 백준에서 알고리즘을 위주로 문제를 풀고 프로그래머스 2단계를 도전할 생각이다.
'코딩테스트(알고리즘)' 카테고리의 다른 글
[백준] javascript vscode에서 풀기 (0) | 2022.05.04 |
---|---|
[Javascript] 백준 문제 풀이 준비 (0) | 2022.04.29 |
[프로그래머스] 신규 아이디 추천_Javascript (0) | 2022.04.28 |
[프로그래머스] 로또의 최고 순위와 최저 순위_Javascript (0) | 2022.04.27 |
[프로그래머스] 숫자 문자열과 영단어_Javascript (1) | 2022.04.26 |