본문 바로가기
코딩테스트(알고리즘)

[프로그래머스] 신고 결과 받기_Javascript

by Cafe Mocha 2022. 5. 2.

문제

코딩테스트 연습 - 신고 결과 받기 | 프로그래머스 (programmers.co.kr)

 

코딩테스트 연습 - 신고 결과 받기

문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의

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단계를 도전할 생각이다.