Algorithm - level1 신고 결과 받기

ryan·2022년 5월 8일
0

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

이용자의 ID가 담긴 문자열 배열 id_list, 각 이용자가 신고한 이용자의 ID 정보가 담긴 문자열 배열 report, 정지 기준이 되는 신고 횟수 k가 매개변수로 주어질 때, 각 유저별로 처리 결과 메일을 받은 횟수를 배열에 담아 return 하도록 solution 함수를 완성해주세요.

나의 풀이 (8.3/100)

function solution(id_list, report, k) {
  // 배열 요소 내 중복 값을 확인하고 splice로 배열 수정
  for (let i = 0; i < report.length; i++) {
    for (let u = i + 1; u < report.length; u++) {
      if (report[i] === report[u]) {
        report.splice(u, 1);
      }
    }
  }
  
  // 신고당한사람과 신고한 사람 배열로 따로 나누기
  let reports = [];
  let reported = [];
  for (let i = 0; i < report.length; i++) {
    reports.push(report[i].split(' ')[0]);
    reported.push(report[i].split(' ')[1]);
  }
  
  // 신고 횟수가 k에 도달하면 중복신고. 배열에 추가
  let duplicateReport = [];
  let count = 0;
  for (let i = 0; i < reported.length; i++) {
    for (let u = i; u < reported.length; u++) {
      if (reported[i] === reported[u]) {
        count += 1;
      }
    }
    if (count < k) {
      count = 0;
    } else if (count >= k || duplicateReport.indexOf(reported[i]) === -1) {
      duplicateReport.push(reported[i]);
      count = 0;
    }
  }
  
  // 중복신고 아이디로 reported 배열에서 인덱스를 추출 
  // report의 index에 대입하여 결과값 추출
  let result = Array(id_list.length).fill(0);
  for (let i = 0; i < duplicateReport.length; i++) {
    for (let u = 0; u < reported.length; u++) {
      if (duplicateReport[i] === reported[u]) {
        let resultIndex = id_list.indexOf(reports[u]);
        result[resultIndex] += 1;
      }
    }
  }
  return result;
}

다른 사람 풀이 뜯어보기

function solution(id_list, report, k) {
  //각 id를 신고한 사람 array를 reportedBy에 저장,
  //k번 이상 신고당한 id를 신고한 id가 받을 메일 수를 mailCount에 저장
  //answer에 mailCount에 저장된 값을 id_list와 같은 id 순서로 저장.
  const reportSet = new Set(report);
  const reportedCount = {}; //{"id": Number(count)} // 각 id 신고당한 횟수
  const reportedBy = {}; //{"id":[]} // id를 신고한 사람 배열로 저장
  const mailCount = {}; //{"id":Number(count)} // result값

  id_list.forEach((element) => {
    reportedCount[element] = 0; // 값 초기화 {muzi: 0, frodo: 0, apeach: 0, neo: 0}
    mailCount[element] = 0;
    reportedBy[element] = [];
  });

  
  reportSet.forEach((element) => {
    const [id, reported] = element.split(" ");
    // 만약 element = ["muzi frodo"] id=muzi, reported=frodo
    reportedCount[reported] += 1; //reportedCount.frodo += 1
    reportedBy[reported].push(id); 
  });

  // 신고당한사람, 신고한사람, 신고한 사람의 배열 값을 이용해 
  // 마지막 mailCount 추가 
  for (const reportedId in reportedCount) {
    if (reportedCount[reportedId] >= k) {
      reportedBy[reportedId].forEach((reporter) => {
        mailCount[reporter] += 1;
      });
    }
  }
  // map을 이용해 각 요소를 mailCount.id값으로 변형
  return id_list.map((id) => mailCount[id]);
}
  • 먼저 데이터 형태와 구조를 설계한 뒤에 시작해야 한다. 성능이 매우 떨어지는 중첩 반복문은 객체와 배열의 반복문으로 충분히 제거할 수 있다.

코드 이해한 후 혼자 다시 풀어보기(100점/100점)

function solution(id_list, report, k) {
  reportSet = new Set(report);
  let reported = {};
  let reportedBy = {};
  let count = {};

  id_list.forEach((e) => {
    reported[e] = 0;
    reportedBy[e] = [];
    count[e] = 0;
  });

  reportSet.forEach((e) => {
    const [id, reports] = e.split(' ');
    reported[reports] += 1;
    reportedBy[reports].push(id);
  });

  for(let props in count){
    if(reported[props]>=k){
      reportedBy[props].forEach(e=>{
        count[e]+=1
      })
    }
  }
  return id_list.map(e=> count[e])
}
profile
프론트엔드 개발자

0개의 댓글