유저간 신고 건수를 파악하여 정지된 유저가 있으면 신고자에게 메일을 보내주고, 신고자가 받게되는 메일의 수를 구하는 문제다.
이 문제에서 고려해야할 주요 포인트는 아래와 같다
https://github.com/FUNco247/Co_Test_Solution/blob/master/reportResult.js
우선 중복신고를 제외하기 위해서 Set()
메소드를 사용했다. 원래 모르고있었던 메소드였는데 중복 제거를 위해 적당한 것을 구글링했다. 여기서 주의해야 할 점은 Set()
은 객체를 리턴한다는 점, new
와 함께 사용한다는 점이다.
그래서 report = [...new Set(report)];
와 같이 중복을 제거한 뒤 다시 배열로 만들어줬다.
배열로 다시 만들어준 이유는 반복문을 사용해 신고자와 피신고자를 나누고 신고당한 횟수를 파악하기 위해서다.
신고자와 피신고자를 구분하기 위해 각각 빈 배열을 생성했다.
let reportPair = [];
let reportedUser = [];
let bannedUser = [];
for (var i = 0; i < report.length; i++) {
const pairArr = report[i].split(" ");
reportPair[i] = pairArr; //배열의 요소로 배열을 갖게됨
reportedUser[i] = report[i].split(" ")[1];
}
reportPair
배열은 스트링으로 되어있는 신고자 / 피신고자를 split(" ")
해서 배열 형태로 바꿔주기 위해 만들었고, 신고당한 횟수를 파악하기 위해 reportedUser
배열을, 결과적으로 정지당한 유저를 파악하기 위해 bannedUser
를 만들었다.
mailCount
를 만들고 id_list
에 있는 유저에 대해 반복문으로 초기값을 0으로 세팅했다. 이 결과 mailCount = { 순신 : 0, 균 : 0 ...}
과 같이 세팅될 것이다. 그 뒤 정지될 유저를 구하기 위해 reportedUser
안에서 유저별 요소의 갯수를 구하고 k개 이상이면 bannedUser
에 포함시켰다. let mailCount = {};
for (var i = 0; i < id_list.length; i++) {
mailCount[`${id_list[i]}`] = 0;
const count = reportedUser.filter(
(element) => element === id_list[i]
).length;
if (count >= k) {
bannedUser.push(id_list[i]);
}
}
reportPair
요소에서 bannedUser
의 요소를 1번 인덱스로 가지고있으면 mailCount
의 숫자를 1씩 늘리는 방법으로 신고메일을 받을 횟수를 결정하였다(arr.includes()
메소드 사용). 그 후 유저별 받을 메일의 수를 arrat로 return 하기 위해 Object.values()
메소드를 사용했다. for (let i = 0; i < reportPair.length; i++) {
if (bannedUser.includes(reportPair[i][1])) {
mailCount[`${reportPair[i][0]}`] += 1;
}
}
answer = Object.values(mailCount);
return answer;
조금 더 코드를 간결하게 하기 위해서 3번과 4번 과정을 통일할 수도 있을것 같다는 생각을 했다. 2일 전에 작성한 코드임에도 불구하고 풀이 리뷰를 작성하고 있는 지금 봐도 보기 불편한 코드다. 좀 더 이해하기 좋게 코드를 작성하는 연습을 해야겠다.
빈 배열, 빈 객체를 생성하는 과정이 많은데 이런 과정이 과연 효율적인 것인지 다른 방법을 찾아보는게 좋을지 공부해봐야겠다.