[Programmers] 92334 신고 결과 받기

6466 단어 algorithmalgorithm

프로그래머스는 레벨 별로 문제가 나뉘어져 있습니다. 그런데 레벨 1 문제에서 생각이 막히면 괜히 자괴감이 듭니다.

어떤 문제를 봐도 거리낌이 없이 노력해야겠습니다.

문제

출처: 프로그래머스 코딩 테스트 연습

풀이

문제의 조건을 간단하게 풀어보자면 이렇습니다.

신고자가 신고한 사람들의 명단 중에 몇 명이나 이용이 정지됐는지 구하는 문제입니다.

function solution(id_list, report, k) {
  const answer = Array(id_list.length).fill(0);
  const info = {};
  for (let id of id_list) { // info 객체 초기화
    info[id] = {
      reported: 0,
      reporters: [],
    };
  } 

  for (let data of report) { 
    const [reporter, reportedPerson] = data.split(' ');

    if (!info[reportedPerson].reporters.includes(reporter)) {
      // 중복 신고 방지
      info[reportedPerson].reported++;
      info[reportedPerson].reporters.push(reporter);
    } 
  } 

  for (let data in info) { // 정지당한 사람 필터링
    if (info[data].reported >= k) {
      for (let reporter of info[data].reporters) {
        answer[id_list.indexOf(reporter)]++;
      }
    }
  }

  console.log(answer);

  return answer;
}

신고자와 신고 당한 횟수를 저장하는 info 객체를 만들고 모든 데이터를 가공한 뒤 인자에 맞게 필터링하는 코드입니다.

이 문제는 알고리즘 문제를 진지하게 풀어야겠다고 마음 먹고 처음으로 풀었던 문제인데 지금 보니 코드가 아주 지저분합니다.

중복을 제거하는 부분에 Set을 이용하면 조금 더 깔끔해질 것 같습니다.

좋은 웹페이지 즐겨찾기