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

Alex J. Lee·2022년 2월 11일
0

Coding Test

목록 보기
1/8
post-thumbnail

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

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

2022 KAKAO BLIND RECRUITMENT

LEVEL 1

문제설명

게시판 불량 이용자를 신고하고 신고 처리 결과를 메일로 발송하는 시스템을 만들고자 한다.

  • 각 유저는 한 번에 한 명의 유저를 신고할 수 있다.
  • 신고 횟수 제한은 없지만, 같은 유저를 여러번 신고해도 해당 유저에 대한 신고 횟수는 1회로 처린된다.
  • k번 이상 신고된 유저는 게시판 이용 정지되고, 정지된 유저를 신고한 유저들에게는 해당 사실을 메일로 발송한다.

이 때, 각 유저별로 신고 처리 결과 메일을 받은 횟수를 배열에 담아 return하는 solution 함수를 작성하시오.

INPUT

id_list

  • 이용자의 ID가 담긴 알파벳 소문자로 이루어진 문자열 배열 (아이디 중복 없음)
  • 2 ≤ id_list의 길이 ≤ 1,000
  • 1 ≤ id_list의 원소 길이 ≤ 10

report

  • 각 이용자가 신고한 이용자의 ID 정보가 담긴 문자열 배열

  • 1 ≤ report의 길이 ≤ 200,000

  • 3 ≤ report의 원소 길이 ≤ 21

  • report의 원소는 "이용자id 신고한id"의 형태의 문자열

    k

  • 정지 기준이 되는 신고 횟수

  • 1 ≤ k ≤ 200, k는 자연수

OUTPUT

  • id_list에 담긴 id 순서대로 각 유저가 받은 결과 메일 횟수를 담은 배열

나의 풀이

  1. report 배열을 순회하면서 reportedResult, reporterResult 객체를 채운다.
    • reportedResult는 이용자의 ID를 키로 가지고, 해당 유저를 신고한 이용자들의 ID를 담은 Set을 값으로 가진다. (같은 이용자에게 여러번 신고 당할 수도 있으므로 중복을 피하기 위해 배열이 아닌 Set을 사용)
    • reporterResult는 이용자의 ID를 키로 가지고, 해당 유저가 신고한 이용자들의 ID를 담은 Set을 값으로 가진다. (마찬가지로 같은 유저를 여러번 신고할 수도 있으므로 중복을 피하기 위해 배열이 아닌 Set을 사용)
  2. id_list 배열을 순회하면서 reportedResult 객체를 참고하여 신고당한 횟수가 k 이상인 이용자들의 ID를 suspended 배열에 추가한다.
    • 신고당한 횟수는 reportedResult에서 해당 이용자의 ID를 키로 가지는 Set의 size와 같다.
  3. id_list 배열의 ID들을 순서대로 순회하면서 각 이용자가 suspended에 있는 이용자들 중 몇명이나 신고했는지를 구해 answer 배열에 추가한다.
  4. answer 배열을 return 한다.
function solution(id_list, report, k) {
  // 1. report 배열을 순회하면서 reportedResult, reporterResult 객체를 채운다
  const reportedResult = {};
  const reporterResult = {};
  for (let i = 0, n = id_list.length; i < n; i++) {
    const userID = id_list[i];
    reportedResult[userID] = new Set();
    reporterResult[userID] = new Set();
  }
  for (let i = 0, n = report.length; i < n; i++) {
    const [reporter, reported] = report[i].split(' ');
    reportedResult[reported].add(reporter);
    reporterResult[reporter].add(reported);
  }
  // 2. id_list 배열을 순회하면서 reportedResult 객체를 참고하여 
  //    신고당한 횟수가 k 이상인 이용자들의 ID를 suspended 배열에 추가한다
  const suspended = [];
  for (let i = 0, n = id_list.length; i < n; i++) {
    const userID = id_list[i];
    if (reportedResult[userID].size >= k) {
      suspended.push(userID);
    }
  }
  // 3. id_list 배열의 ID들을 순서대로 순회하면서 각 이용자가 suspended에 있는 이용자들 중 
  //    몇명이나 신고했는지를 구해 answer 배열에 추가한다
  const answer = [];
  for (let i = 0, n = id_list.length; i < n; i++) {
    const userID = id_list[i];
    const reportedUsers = reporterResult[userID];
    let count = 0;
    for (let j = 0, m = suspended.length; j < m; j++) {
      if (reportedUsers.has(suspended[j])) {
        count++;
      }
    }
    answer.push(count);
  }
  // 4. answer 배열을 return 한다
  return answer;
}
profile
🦄✨글 잘 쓰는 개발자가 되기 위해 꾸준히 기록합니다 ✨🦄

0개의 댓글