수도 코드
모든 사용자 정보가 id_list에 존재
0. 사용자별로 신고당한 횟수를 기록하는 자료 필요 (초기화): reported[user] = 0
1. report를 순회하면서 아래 작업을 수행
1.1 신고자와 신고당한 자를 구분 : src, dst(string.split(" "))
1.2 각 사용자별로 신고한 사람을 기록 : reporter[src] = Set("dst1", "dst2")
1.3 각 사용자별로 신고당한 횟수를 기록 : reported[dst] = reported[dst] + 1
1.3.1 이 때 동일한 사람에게 신고한 경우 횟수를 업데이트 하지 않는다
2. reported를 순회하면서 k이상인 사람을 filter한다. banned
3. reporter를 순회하면서 banned에 포함된 사람이 있는지 확인한다.
import java.util.*;
class Solution {
public int[] solution(String[] id_list, String[] report, int k) {
Map<String, Integer> reported = new HashMap<>();
Map<String, Set<String>> reporter = new HashMap<>();
//초기화
for (String id : id_list) {
reported.put(id, 0);
reporter.put(id, new HashSet<>());
}
for (String r : report) {
String[] srcToDst = r.split(" ");
String src = srcToDst[0];
String dst = srcToDst[1];
// src가 dst를 신고했다
// 동일한 사용자에 대한 신고는 무시
if (reporter.get(src).contains(dst) == false) {
reported.put(dst, reported.get(dst) + 1);
reporter.get(src).add(dst);
}
}
// k번 이상 신고 당한 사람을 신고한 사람에게 메일을 보낸다
int[] answer = new int[id_list.length];
for (int i = 0; i < id_list.length; i++) {
String src = id_list[i];
int count = 0;
// src가 신고한 사용자들
for (String dst : reporter.get(src)) {
if (reported.get(dst) >= k) count++;
}
answer[i] = count;
}
return answer;
}
}