Algorithm & 자료구조/알고리즘 w.JavaScript

[알고리즘 JS]프로그래머스 Lv.1 신고 결과 받기

프라이D 2022. 6. 21. 16:13

문제

https://programmers.co.kr/learn/courses/30/lessons/92334

 

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

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

programmers.co.kr

풀이

// 입력값
const id_list = ['muzi', 'frodo', 'apeach', 'neo'];

const report = [
  'muzi frodo',
  'apeach frodo',
  'frodo neo',
  'muzi neo',
  'apeach muzi',
];

const k = 2;

// 풀이
function solution(id_list, report, k) {
  const answer = new Array(id_list.length).fill(0);
  const report_list = {};

  // 불량이용자 : [신고한 유저들] 로 이루어질 맵 생성 (빈 배열 할당)
  id_list.map((user) => (report_list[user] = []));

  report.map((user) => {
    const [user_id, report_id] = user.split(' ');
    // user_id 가 없을 때만 추가해서 중복카운트 방지
    if (!report_list[report_id].includes(user_id))
      report_list[report_id].push(user_id);
  });

  for (let [key, val] of Object.entries(report_list)) {
    // 신고 건수가 k를 넘는 정지대상 이용자
    if (val.length >= k) {
      // id_list의 유저 인덱스와 동일한 answer 배열 증가
      val.map((user) => (answer[id_list.indexOf(user)] += 1));
    }
  }
  return answer;
}

// console.log(solution(id_list, report, k));
  • 처음에는 각 유저별로 신고 건수를 표기한 Map 객체를 만들고, value 값이 2 인 key만 모은 다음, report 배열 요소와 비교해 해당 요소에 정지 유저가 포함되어 있으면 증감시키는 방향으로 풀려고 했다.
  • Map 객체에서 특정 조건을 만족하는지 확인하는게 좀 어려웠고 반복문을 쓸데없이 많이 돌리는 것 같아 다른 풀이를 참고하게 되었다.
  • 내가 생각한 방식은 신고 유저 = [신고한 불량이용자들] 에서 정지 대상 이용자를 포함하고 있으면 정답 배열에서 증감하는 방식이었다. 해당 풀이에서는 불량이용자 = [신고한 유저들] 을 할당해서 이를 세는 방식이었고, 내가 생각한 방식보다 훨씬 간편한 것 같다.
  • 내 방식에서는 신고 유저가 신고한 이용자들 중 정지 이용자가 있는지를 다시 한번 파악해야 하는데, 이 접근 방식에서는 신고 누적 건수(배열의 길이)만 확인하면 되기 때문이다. 
  • 흑흑 문제가 좀 어려웠다, 나중에 다시 풀어봐야지..