Coding

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

낮에만코딩함 2022. 7. 12. 12:26

https://school.programmers.co.kr/learn/courses/30/lessons/92334?language=javascript 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

프로그래머스의 신고 결과 받기 문제이다.

 

문제 설명

신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다.

  • 각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.
    • 신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.
    • 한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.
  • k번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다.
    • 유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다

입력으로는 아이디 리스트와 신고된 report, 경고 제한 횟수 이렇게 총 3개의 입력이 들어온다.

 

Id_list report k
["muzi", "frodo", "apeach", "neo"] ["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"] 2
["con", "ryan"] ["ryan con", "ryan con", "ryan con", "ryan con"] 3

 

문제를 풀기 전에 주의해야 할 점

1. 신고를 했을 때 그 사람이 정지를 먹으면 신고를 한 사람이 메일을 받는다.

2. 같은 사람을 중복으로 신고하더라도 경고는 1회만 적용된다.

 

이 정도이다.

 

처음에 무지성으로 풀다가 for문이 너무 많이 나와서 이렇게 맞아도 별 의미가 없겠다 싶어서

 

hash 자료구조를 써야겠다고 생각했다.

 


문제풀이

 

위에 언급했듯이 객체와 hash구조를 이용해서 해보겠다.

 

1. 먼저 id_list를 이용해 유저가 당한 경고 횟수와 그 유저가 신고한 유저들을 저장할 것이다.

 

                  let list = id_list.reduce((user,index)=>{

                  user[index]=[0,[]];
                  return user;
                    },{});
 
 

2. 중복 신고 방지를 위해 set을 이용해준다.

 

               let new_report = new Set(report);
               for(x of new_report){
               let [ID,cID] = x.split(' ');
                  list[ID][1].push(cID);
                  list[cID][0]++;
              }
 
3. K번 이상 신고된 ID를 filter를 이용하여 거르고 그 결과를 emailList에 저장한다.
 
          const banned = id_list.filter((id) => list[id][0] >= k);
          const emailList = id_list.map((id) => {
                    return list[id][1].filter((id) => {
                        return banned.includes(id);
                  }).length;
           });
 
전체코드
 
 
  function solution(id_list, report, k) {
            let list = id_list.reduce((user,index)=>{
                  user[index]=[0,[]];
                  return user;
         },{});

            let new_report = new Set(report);
               for(x of new_report){
               let [ID,cID] = x.split(' ');
                  list[ID][1].push(cID);
                  list[cID][0]++;
              }

          const banned = id_list.filter((id) => list[id][0] >= k);
          const emailList = id_list.map((id) => {
                    return list[id][1].filter((id) => {
                        return banned.includes(id);
                  }).length;
           });

          return emailList;
}

참고

https://onlydev.tistory.com/137