230424_Algorithm

majungha·2023년 4월 24일
1

알고리즘

목록 보기
33/71

오늘의 알고리즘 👍

📝 1. 신고 결과 받기


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

▷ 입출력 예

solution(["muzi", "frodo", "apeach", "neo"], ["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"], 2) // [2,1,1,0]
solution(["con", "ryan"], ["ryan con", "ryan con", "ryan con", "ryan con"], 3) // [0,0]

▷ 내 풀이

function solution(id_list, report, k) {
  let answer = [];
  let result = [];

  for (let i = 0; i < report.length; i++) {
    answer.push(report[i].split(' '));
    for (let j = 0; j < report.length; j++) {
      answer[i][1] === answer[j][1] ? (result[i] += 1) : -1;
    }
  }

  return answer;
}

▷ 해결 못함 ❌

  • 시간이 부족해서 해결을 하지 못했다.

▷ 수업 풀이

function solution(id_list, report, k) {
  const reporter = {}; // 신고한 사람이 어떤 유저를 신고했는지 저장
  const users = {}; // 신고당한 사람의 누적 신고량 저장

  const answer = []; // 정답을 저장
  report = [...new Set(report)];

  for (let i = 0; i < report.length; i++) {
    const info = report[i].split(' ');

    // 신고한 사람이 어떤 사람들을 신고했는지를 저장할 수 있는 빈 배열을 생성
    if (!reporter[info[0]]) {
      reporter[info[0]] = [];
    }

    // 신고당한 사람이 몇번 신고를 당했는지 저장할 수 있는 초기값을 생성
    if (!users[info[1]]) {
      users[info[1]] = 0;
    }
    // 중복 신고 방지 : 내가 신고한 내역에 해당 유저가 없는 경우에만
    // if(!reporter[info[0]].includes(info[1])) {
    // 신고한 사람이 어떤 유저들을 신고헀는지 저장
    reporter[info[0]].push(info[1]);

    // 신고 당한 유저의 신고 횟수 카운트
    users[info[1]]++;
    // }
  }

  for (let i = 0; i < id_list.length; i++) {
    const reporterList = reporter[id_list[i]] || [];
    answer[i] = 0;

    for (let j = 0; j < reporterList.length; j++) {
      if (users[reporterList[j]] >= k) {
        // 해당 유저의 신고 횟수가 정지 사유에 부합하는 경우 (k번 이상인 경우)
        answer[i]++;
      }
    }
  }
  return answer;
}

▷ reduce, map 매서드 사용 풀이

function solution(id_list, report, k) {
  const reporter = {}; // 신고한 사람이 어떤 유저를 신고했는지 저장

  report = [...new Set(report)];

  // 신고당한 사람의 누적 신고량 저장
  const users = report.reduce((acc, cur) => {
    const info = cur.split(' ');

    if (!reporter[info[0]]) {
      reporter[info[0]] = [];
    }
    if (!acc[info[1]]) {
      acc[info[1]] = 0;
    }

    reporter[info[0]].push(info[1]);
    acc[info[1]]++;

    return acc;
  }, {});

  return id_list.map((id) => {
    const arr = reporter[id]; // || [];
    return (arr || []).reduce((acc, cur) => {
      return acc + (users[cur] >= k ? 1 : 0);
    }, 0);
  });
}
  • 어떠한 데이터를 종합해서 문제를 풀어야 할 때는 객체를 이용하면 편리하다.

출처: 프로그래머스
출처: 코드캠프

profile
개발자 블로그 / 항상 겸손한 자세로 배우면서 성장하자 할 수 있다!

0개의 댓글