문제 설명
신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다.
각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.
신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.
한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.
k번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다.
유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다.
다음은 전체 유저 목록이 ["muzi", "frodo", "apeach", "neo"]이고, k = 2(즉, 2번 이상 신고당하면 이용 정지)인 경우의 예시입니다.
이 문제를 보고 나서 처음에 든생각은 객체를 이용하면 편하게 풀 수 있겠다 싶었다.
신고자이름에 신고건수를 붙이면 원활해 질것 같았기때문이다.
그래서 객체를 이용해서 문제 푸는 방법으로 접근을 해보았다.
여러방법을 찾던 도중에
Map과 Set에 대해 알게 되었고
쓰는 방법은 이렇다
Map
Set
for in 과 for of
간단하게 설명하면 for in은 객체 for of는 배열에 쓴다고 볼 수 도 있다.
for in은 enumerable한 것들만 출력한다.
enumerable은 객체의 property중 하나인데 이중 true인것만 출력한다.
for of는 iterable인 자료형들에만 적용 가능하다
여기에는 set 과 map 자료형도 있다.
iterable는 Symbol.iterator이라는 메서드를 지니고 있는 자료형을 말하고 Symbol.iterator이라는 메서드를 출력하면
Array Iterator {}이 출력된다.
function solution(id_list, report, k) {
let reports = [...new Set(report)].map(a=>{return a.split(' ')});
let counts = new Map();
for (const bad of reports){
counts.set(bad[1],counts.get(bad[1])+1||1)
}
let good = new Map();
for(const report of reports){
if(counts.get(report[1])>=k){
good.set(report[0],good.get(report[0])+1||1)
}
}
let answer = id_list.map(a=>good.get(a)||0)
return answer;
}
문제는 처음에 중복되는 것은 1회로 처리 하기 때문에 중복값을 없애주기 위해Set을 통해 없애주었다.
그 후에 신고자와 받은자가 띄어쓰기로 나누어 져있어 split로 배열로 나누었고
신고받은 사람이 몇번 신고 받았는지 counts 라는 배열을 만들었고
신고횟수가 k번이상인 대상을 다시 신고한사람(이메일 받을 사람)에 이메일 을 보내주기 위해 다시 신고한사람 받을 이메일 을 가진 배열 good을 만들어 주었다.
그리고 신고 기준 이하는 0이기때문에 신고자의 이메일 받을 횟수를 가진 배열 answer을 만들었다.