본문 바로가기
Algorithm

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

by Vintz 2022. 3. 10.
반응형

문제 풀이

이게 정말 레벨1 문제인가..? 카카오 기술 블로그에서는 해시 자료구조를 활용할 수 있는지에 대한 문제라고 설명한다. (게다가 정답률이 80.13%다. 😲)

1. userList 만들기

const userList = id_list.reduce((result, currentId) => {
  result[currentId] = [0, []];
  return result;
}, {});

먼저 신고된 횟수와 신고한 유저를 담을 userList를 만든다. reduce() 메서드를 통해 이런식으로 객체를 만들 수 있다는 것을 다시 한번 배우게 됐다.

유저마다 신고된 횟수와 해당 유저를 신고한 유저의 ID를 담을 객체를 생성했다

2. userList에 신고된 횟수, 신고한 유저 ID 담기(중복 제거)

for (const id of new Set(report)) {
  const [REPORT_ID, ID] = id.split(' ');
  userList[REPORT_ID][1].push(ID);
  userList[ID][0]++;
}

동일한 유저에 대한 신고 횟수는 1회로 처리되기 때문에 중복을 제거 해야 한다. Set을 통해 중복을 제거하고, 순회하면서 split() 메서드로 '신고한 유저'와 '신고된 유저'를 나눠 준다. 그 후 신고한 유저의 ID를 담고, 신고된 횟수를 +1 한다.

신고된 횟수와 신고한 유저의 ID를 담았다

3. 정지된 유저와 메일 리스트

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

유저가 신고한 ID가 정지 되었을 경우 메일을 받게 된다. 따라서 정지 기준인 k회 이상 신고된 ID를 변수에 담는다. 유저마다 신고한 ID가 정지가 됐다면 해당 ID를 추가한다. 마지막으로 그 결과의 수를 반환한다.

예시로 "muzi"는 신고한 ID가 "frodo", "neo"이며 정지된 아이디도 동일하기 때문에 처리 결과 메일을 2회 받게 된다

전체 코드

function solution(id_list, report, k) {
  const userList = id_list.reduce((result, currentId) => {
    result[currentId] = [0, []];
    return result;
  }, {});

  for (const id of new Set(report)) {
    const [REPORT_ID, ID] = id.split(' ');
    userList[REPORT_ID][1].push(ID);
    userList[ID][0]++;
  }

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

  return emailList;
}

참고

신고 결과 받기 - 프로그래머스
2022 카카오 신입 공채 1차 온라인 코딩테스트 문제해설 - 카카오 기술 블로그
Array.prototype.reduce() - MDN
맵과 셋 - javascript.info
반응형