본문 바로가기
codingTest/programmers

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

by arthur_noh 2022. 4. 23.

친구 K 군과 함께하는 코테 알고리즘 도전기

언어는 js로 통일하고 매일 프로그래머스에서 1문제 씩 풀기로 했다.

오늘은 맨 처음 문제를 풀 것


 

● 문제해결아이디어

문제를 잘 읽어보면
1. 유저 목록을 주고
2. "신고한사람  신고당한사람" 이런 형식의 배열을 주고
3. K번 이상 신고가 되면, 신고한 사람과 당한 사람 모두에게 이메일을 준다

 

간단하게 생각해보면 좋을 것 같다.

1. 신고 당한 유저의 ID를 키 값으로 설정하고, [배열] 형태의 신고한 유저를 담는 오브젝트를 만든다.

2. 해당 오브젝트를 순회하면서 신고한 유저의 수를 세고, k 보다 높다면 각 이름에 +1 씩 하면 된다.

 

● 풀이

const id\_list = \["muzi", "frodo", "apeach", "neo"\];  
const report = \[ "muzi frodo", "apeach frodo" , "frodo neo", "muzi neo", "apeach muzi"\];  
const k = 2  

const solution = (id\_list, report, k) => {  
  const result = new Array(id\_list.length);  // 유저 수만큼 리스트를 만들고  
  result.fill(0);  // 기본값은 0으로 채워준다.  

  const reportList = {};  // 신고당한 사람의 오브젝트를 만들고  
  id\_list.map((user) => {  
    reportList\[user\] = \[\]  // 키 값은 유저 이름으로 만든다.  
  });  

  report.map((user) => {  // 신고 리스트를 순회하면서  
    const \[userId, reportId\] = user.split(' ');  // 신고한 유저, 당한 유저를 띄어쓰기 ' ' 로 분리하고  
    if (!reportList\[reportId\].includes(userId)) {  // 만약 신고가 되어있지 않다면(이미 신고한 경우를 거를려고)  
      reportList\[reportId\].push(userId);  // 아까 만든 신고당한사람 오브젝트에 신고한 사람 이름을 넣는다.  
    }  
  });  

  for(const key in reportList) {  // 신고당한 사람 오브젝트를 순회하면서  
    if(reportList\[key\].length >= k) {  // K 번 이상의 사람 이름이 들어가면  
      reportList\[key\].map((user) => {  // 유저 이름 다 찾아서  
        result\[id\_list.indexOf(user)\] += 1;  // 메일 리스트에 +1 씩 해준다.  
      })  
    }  
  }  

  return result;  
}  

console.log(solution(id\_list, report, k));