신고 결과 받기

은유로그·2022년 1월 26일
0

👩‍💻 algorithm

목록 보기
7/11

오늘의 문제

한 줄 설명

불량 이용자를 신고하여 해당 유저가 정지됐을 때, 처리 된 횟수를 출력하는 문제
문제 👉 programers


참고사항

  • 한 명의 유저는 한 명의 유저만 신고 가능
  • 신고 횟수 제한은 없음
  • 한 명의 유저가 같은 유저를 여러번 신고 가능하나 한 번으로 간주
  • k번 이상 신고된 유저는 정지되고, 해당 유저를 신고한 유저에게 메일링
  • report의 요소는 "신고한 유저 신고당한 유저"로 이루어져있고 둘 사이는 하나의 공백으로 구분
  • 제한 시간: 10초

입출력 예시

입력:

id_list = ["muzi", "frodo", "apeach", "neo"];
// 유저 목록
report = ["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi","muzi frodo"];
// 각 유저가 신고한 유저 정보
k = 2;
// 정지 기준

출력:

result = [2, 1, 1, 1]

수도코드

수도코드 작성하기 전 이 문제를 풀기 위해서 3가지의 큰 틀을 생각했다.

  1. 신고 당한 유저와 그 유저를 신고한 유저의 목록
  2. 신고한 유저가 정지 당해 메일 서비스를 받을 유저 목록
  3. k번 이상 신고 당해 메일 서비스 받을 유저의 값 카운팅

이 3가지의 틀을 생각하며 수도코드를 작성했다.

  1. report 요소를 공백 기준으로 나눈다. 첫 번째는 신고자, 두 번째는 신고당한 자
  2. 만약 신고당한 자가 reportID(객체)의 key로 존재하지 않는다면 신고당한 자(key), 신고자가 담긴 배열(value) 생성
  3. key로 존재한다면 중복 체크해서 배열에 신고자 추가
  4. report의 길이만큼 반복한다.
  1. id_list의 요소가 key, 초기값은 0인 mailing(객체) 생성

  2. 만약 신고당한 자의 값(신고한 유저가 담긴 배열)의 길이가 k 이상일 경우, mailing의 해당 유저(key)의 값 횟수 1 증가

  3. mailing의 값을 순서대로 answer에 담아 출력


첫번째 시도

  • 대부분 통과 실패 ㅠㅠ
function solution(id_list, report, k) {
  let mailing = {};
  
  for(let i = 0; i < id_list.length; i++){
    mailing[id_list[i]] = 0;
  }
  
  let reportID = {};
  
  for(let i = 0; i < report.length; i++){
    let declare = report[i].split(" ")[0];
    let declared = report[i].split(" ")[1];
    
    if(declared in reportID ){
      if(reportID[declared].indexOf(declare) === -1) reportID[declared].push(declare);
    }
    else{
      reportID[declared] = [declare];
    }
  }
  
  for(let key in reportID){
    let declare = reportID[key];
    
    if(declare.length === k) {
      for(let i = 0; i < declare.length; i++){
        if(declare[i] in mailing){
          mailing[declare[i]]++;
        }
      }
    }
  }
  
  let answer = [];
  
  for(let key in mailing){
    answer.push(mailing[key]);
  }
  
  return answer;
}

두번째 시도

  • 전부 통과함!
  • k번 이상으로 체크해야하는데 k와 같다면으로 체크함
// --- 수정 전
...
    if(declare.length === k) { // 잘못된 부분!
      for(let i = 0; i < declare.length; i++){
        if(declare[i] in mailing){
          mailing[declare[i]]++;
        }
      }
    }
...

// --- 수정 후
...
    if(declare.length >= k) { // 수정한 부분!
      for(let i = 0; i < declare.length; i++){
        if(declare[i] in mailing){
          mailing[declare[i]]++;
        }
      }
    }
...

개선할 부분

  • 글로 쓰다보니 필요 없는 for문이 있는 거 같다. (mailing 객체 생성, answer 배열 생성)
  • 보기 편하게 answer를 따로 만들었지만, 제한 시간(10초)가 있는 문제이므로 바로 출력할 수 있게 코드를 써도 될 거 같다.
profile
๑•‿•๑

0개의 댓글