id_list
이용자의 ID가 담긴 문자열 배열 | ["muzi", "frodo", "apeach", "neo"] | 2 ≤ id_list의 길이 ≤ 1,000, 1 ≤ id_list의 원소 길이 ≤ 10, id_list의 원소는 이용자의 id를 나타내는 문자열이며 알파벳 소문자로만 이루어져 있고 id_list에는 같은 아이디가 중복해서 들어있지 않음
report
각 이용자가 신고한 이용자의 ID 정보가 담긴 문자열 배열 | ["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"] | ≤ report의 길이 ≤ 200,000, 3 ≤ report의 원소 길이 ≤ 21
k
정지 기준이 되는 신고 횟수 | 2 | 1 ≤ k ≤ 200, k는 자연수
각 유저별로 처리 결과 메일을 받은 횟수를 배열에 담아 return
Map에 신고한 사람 : (Set)신고당한사람 으로 저장한 뒤, 신고를 k이상 받은 사람을 신고한 사람의 cnt 증가
import java.util.*;
class Solution {
public int[] solution(String[] id_list, String[] report, int k) {
int N = id_list.length;
Map<String, Integer> order = new HashMap<>();
for(int n=0; n<N; n++){
order.put(id_list[n], n);
}
Map<String, Set<String>> report_res = new HashMap<>();
int[] cnt = new int[N];
for(String rep : report){
StringTokenizer st = new StringTokenizer(rep);
String user_a = st.nextToken();
String user_b = st.nextToken();
if(report_res.containsKey(user_a)){
Set<String> a_report = report_res.get(user_a);
if(a_report.contains(user_b))
continue;
a_report.add(user_b);
}else{
Set<String> set = new HashSet<>();
set.add(user_b);
report_res.put(user_a, set);
}
cnt[order.get(user_b)] += 1;
}
int[] ans = new int[N];
int point = 0;
for(Set<String> set : report_res.values()){
for(String val : set){
int idx = order.get(val);
if(k <= cnt[idx]){
ans[point]+=1;
}
}
point+=1;
}
return ans;
}
}
import java.util.*;
class Solution {
public int[] solution(String[] id_list, String[] report, int k) {
int N = id_list.length;
Map<String, Integer> order = new HashMap<>();
for(int n=0; n<N; n++){
order.put(id_list[n], n);
}
Map<String, Set<String>> report_res = new LinkedHashMap<>();
int[] cnt = new int[N];
for(String rep : report){
StringTokenizer st = new StringTokenizer(rep);
String user_a = st.nextToken();
String user_b = st.nextToken();
if(report_res.containsKey(user_a)){
if(report_res.get(user_a).contains(user_b))
continue;
report_res.get(user_a).add(user_b);
}else{
Set<String> set = new LinkedHashSet<>();
set.add(user_b);
report_res.put(user_a, set);
}
cnt[order.get(user_b)] += 1;
}
int[] ans = new int[N];
int point = 0;
for(String id : id_list){
for(String val : report_res.getOrDefault(id, new HashSet<>())){
int idx = order.get(val);
if(k <= cnt[idx]){
ans[point]+=1;
}
}
point+=1;
}
return ans;
}
}
Tip : Java에서 Map의 메소드 중 하나인 values()는 순서를 보장해서 가져오지 않으므로 주의해야 한다.