알고리즘

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

로돌씨 2024. 3. 24. 19:36

출처 - https://school.programmers.co.kr/learn/courses/30/lessons/92334

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

풀이

function solution(id_list, report, k) {
  const newRepo = [...new Set(report)]; // report 중복 제거
  const banned = []; // 정지 아이디
  const reportedCnt = Array(id_list.length).fill(0); // 신고수 [0,0,0,0]
  const alert = Array(id_list.length).fill(0); // 메일수 [0,0,0,0]

  for (let r of newRepo) {
    let a = r.split(" ")[0]; // 유저 ID
    let b = r.split(" ")[1]; // 유저가 신고한 ID
    let idxB = id_list.indexOf(b); // id_list에서 신고받은 유저의 index 칮기
    reportedCnt[idxB] += 1; // 신고받은 유저의 신고수 누적 더하기

    // 신고수가 k개 이상인 경우
    if (reportedCnt[idxB] >= k) {
      // 정지 리스트에 해당 아아디 추가
      banned.push(id_list[idxB])
    }
  }

  // 메일
  newRepo.map((r, idx) => {
    let a = r.split(' ')[0] // 유저 ID
    let b = r.split(' ')[1] // 유저가 신고한 ID

    // 신고한 ID(b)에 정지된 ID가 있는지 확인
    if (banned.indexOf(b) >= 0) {
      // 신고한 ID 중에 정지된 ID가 있다면, 
      // 해당 유저(a)의 id_list에서의 인덱스를 구하고
      // mail의 해당 인덱스에 1 더하기
      let idx = id_list.indexOf(a);
        alert[idx] += 1;
    } 

  }) 

  return alert;
}

 

Array(n).fill(n) :

n길이의 배열을 n으로 채우겠다. 위의 코드에서는 id_list의 길이만큼 0으로 채워넣었음

 

for (let i of array){}:

배열을 순회하며 각 요소에 함수를 적용함

 

위의 코드에서느 a와 b를 만들어 a에는 현재요소를 띄어쓰기를 기준으로 나누어 0번째 인덱스에 유저 id를 할당하고 1번째 인덱스에 신고 당한 유저의 id를 할당함

 

idxB에는 유저리스트에서 신고받은 유저의 인덱스를 찾은후 그만큼 reportedCnt에 수를 누적