[JavaScript][Programmers] 신고 결과 받기

조준형·2022년 1월 25일
0

Algorithm

목록 보기
142/142
post-thumbnail

🔎 신고 결과 받기

❓ 문제링크

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

📄 제출 코드

function solution(id_list, report, k) {
  var answer = [];
  const cnt = id_list.length;

  let idList = {};
  resetIdList(idList, id_list, cnt);


  let checkList = {};
  setCheckList(checkList, id_list, cnt);
  makeCheckList(checkList, report, cnt);
  countReport(idList, checkList, cnt);


  let banList = [];
  makeBanList(banList, idList, id_list, cnt, k);
  
  resetIdList(idList, id_list, cnt);
  countBanResponse(idList, checkList, banList,report);


  answer = Object.values(idList)

  return answer;
}

function countBanResponse(idList, checkList, banList){
  const keyList = Object.keys(checkList);

  for(let i=0;i<keyList.length;i++){
    const key = keyList[i];
    const item = [...checkList[key]]
    for(let j=0;j<banList.length;j++){
      if( item.indexOf(banList[j])!=-1){
        idList[key] += 1;
      }
    }
  }
}
function makeBanList(banList, idList, id_list, cnt, k){
  for(let i=0;i<cnt;i++){
    if(idList[id_list[i]] >= k){
      banList.push(id_list[i])
    }
  }
}

function countReport(idList, checkList){
  const keyList = Object.keys(checkList);
  
  for(let i=0;i<keyList.length;i++){
    const key = keyList[i];
    const item = [...checkList[key]]
    for(let j=0;j<item.length; j++){
      idList[item[j]] += 1;
    }
  }
}

function makeCheckList(checkList, report){
  for(let i=0;i<report.length;i++){
    const fst = report[i].split(' ')[0];
    const scd = report[i].split(' ')[1];
    checkList[fst].add(scd);
  }
}

function setCheckList(checkList, id_list, cnt){
  for(let i=0;i<cnt;i++){
    checkList[id_list[i]] = new Set();
  }
}
function resetIdList(idList, id_list, cnt){
  for(let i=0;i<cnt;i++){
    idList[id_list[i]] = 0;
  }
}


const id_list= ["muzi", "frodo", "apeach", "neo"];
const report = ["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"];
const k = 2;
console.log(solution(id_list, report, k) );

오랜만에 알고리즘을 풀어봤다.
문제 순서대로 차례차례 반복문을 써가다가 오히려 햇갈리는거 같아서 전부 메소드로 빼서 작성했다.

👉 구성요소

먼저 구성요소로는 정답을 저장할 배열 answer
숫자를 세고 저장해둘 idList
중복을 지우고 이름별로 신고한 값을 저장할 checkList
불량이용자 banList
이렇게 구성하였다.

👉 1. resetidList

function resetIdList(idList, id_list, cnt){
  for(let i=0;i<cnt;i++){
    idList[id_list[i]] = 0;
  }
}

idList의 초기값을 set해줄 메소드이다.
이름별로 0을 세팅해준다.

👉 2. setCheckList

각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.

신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.

한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.

라고 문제에 나와있다.
그렇기 때문에 초기값은 이름별로 Set() 을 사용했다.

function setCheckList(checkList, id_list, cnt){
  for(let i=0;i<cnt;i++){
    checkList[id_list[i]] = new Set();
  }
}

👉 3. makeCheckList

function makeCheckList(checkList, report){
  for(let i=0;i<report.length;i++){
    const fst = report[i].split(' ')[0];
    const scd = report[i].split(' ')[1];
    checkList[fst].add(scd);
  }
}

CheckList를 만들어주는 메소드.
report의 각 배열의 값들을 split으로 나누어 해당 이름의 set에 추가하였다.

👉 4. countReport

function countReport(idList, checkList){
  const keyList = Object.keys(checkList);
  
  for(let i=0;i<keyList.length;i++){
    const key = keyList[i];
    const item = [...checkList[key]]
    for(let j=0;j<item.length; j++){
      idList[item[j]] += 1;
    }
  }
}

각 이름별로 신고당한 횟수를 idList에 count한다.

👉 5. makeBanList

function makeBanList(banList, idList, id_list, cnt, k){
  for(let i=0;i<cnt;i++){
    if(idList[id_list[i]] >= k){
      banList.push(id_list[i])
    }
  }
}

신고당한 횟수가 k번이 넘으면 banList에 추가한다.

👉 6. countBanResponse

function countBanResponse(idList, checkList, banList){
  const keyList = Object.keys(checkList);

  for(let i=0;i<keyList.length;i++){
    const key = keyList[i];
    const item = [...checkList[key]]
    for(let j=0;j<banList.length;j++){
      if( item.indexOf(banList[j])!=-1){
        idList[key] += 1;
      }
    }
  }
}

위에서 만든 checkList에서 banList에 포함된게 있다면 idList에 값을 count한다.
! 물론, 해당 메소드를 사용하기전 idList를 resetIdList로 초기화시켜준다.

처음에 2번에서 작성한 문제조건을 생각안하고 했다가 문제 제출에서 틀려버렸다.
제한시간이 있어 쫄았지만, 무사히 통과해서 다행이다.
문제를 잘 읽자.

profile
깃허브 : github.com/JuneHyung

0개의 댓글