id_list | report | k | result |
---|---|---|---|
["muzi", "frodo", "apeach", "neo"] | ["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"] | 2 | [2,1,1,0] |
["con", "ryan"] | ["ryan con", "ryan con", "ryan con", "ryan con"] | 3 | [0,0] |
신고횟수 제한x.
한유저 여러번 신고할수 있으나, 이때는 신고횟수 1회로 처리.
k번이상 신고된 유저는 게시판 이용 정지, 신고한사람에게 정지사실 메일링(마지막에 한꺼번에).
id_list=["muzi", "frodo", "apeach", "neo"]
report=["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"]
k=2
answer=[2,1,1,0];
신고한 사람 맵
muzi : frodo(1), neo(3) -> 2
frodo : neo(3) -> 1
apeach : frodo(1), muzi(0) -> 1
neo :
-> return [2,1,1,0]
신고당한 횟수 배열
muzi frodo apeach neo
1 2 2
frodo, neo 정지됨.
function solution(id_list, report, k) {
//동일유저 신고횟수가 여러번일경우, 1회로 처리되므로 배열에서 중복값을 제거
const set = new Set(report);
const newReport = [...set];
//key: 유저ID, value:[id_list에서 유저가 신고한 ID의 index] 맵 생성
const map = new Map();
for(let i=0; i<newReport.length; i++){
let [user, reportedUser] = newReport[i].split(" ");
const reportedUserIdx = id_list.indexOf(reportedUser);
if(map.has(user)){
map.get(user).push(reportedUserIdx);
}
else{
map.set(user, [reportedUserIdx]);
}
}
//신고받은 횟수를 저장하는 배열
const reportedArr = new Array(id_list.length).fill(0);
for(let i=0; i<newReport.length; i++){
let [user, reportedUser] = newReport[i].split(" ");
let reportedUserIdx = id_list.indexOf(reportedUser);
reportedArr[reportedUserIdx]++;
}
//신고받은 횟수가 k회 이상이면 answer 배열-> 신고한 유저아이디의 index자리에 ++
let answer = new Array(id_list.length).fill(0);
for(let i=0; i<reportedArr.length; i++){
for(let [user, reportedUserArr] of map){
let userIdx = id_list.indexOf(user);
if(reportedArr[i]>=k && reportedUserArr.includes(i)){
answer[userIdx]++;
}
}
}
return answer;
}
O(3R)+O(RKV)
O(R)+O(M)+O(2L)
const set = new Set(dupArr);
const Arr = [...set];