import java.util.*;
class Solution {
public int[] solution(String[] id_list, String[] report, int k) {
int[] answer = new int[id_list.length];
//report 중복제거 HashSet
HashSet<String> reportSet = new HashSet<>(Arrays.asList(report));
//reporter 기준으로 신고내역 정리
HashMap<String, HashSet<String>> reportMap = new HashMap<>();
//reported가 신고받은 횟수 기록
HashMap<String, Integer> reportedMap = new HashMap<>();
for(String reportInfo : reportSet){
//reportSet의 내용을 reporter와 reported로 분리
String reporter = reportInfo.split(" ")[0];
String reported = reportInfo.split(" ")[1];
//키값이 존재하면 null 없으면 값을 넣음
reportMap.putIfAbsent(reporter, new HashSet<String>(){{
add(reported);
}});
//reporter가 신고한 사람으로 reported를 추가
reportMap.get(reporter).add(reported);
//reported가 신고당한 횟수를 누적
reportedMap.put(reported, reportedMap.getOrDefault(reported, 0)+1);
}
//신고 횟수에 따라 다른 처리
for (String reported : reportedMap.keySet()){
//이 신고자가 신고받은 횟수를 저장한 변수
int reportedCount = reportedMap.get(reported);
if(reportedCount >= k){ //신고가 기준을 넘어설때
for(int i=0; i<id_list.length; i++){//신고자를 찾음
if(reportMap.containsKey(id_list[i]) && reportMap.get(id_list[i]).contains(reported)) {//신고자가 신고한 이력이 있을경우 +1
answer[i]++;
}
}
}
}
return answer;
}
}
예전에 자바로 풀었던 문제다. 다시 공부하려고 봐도 꽤 고민을 많이 했던 기억이 난다.
우선 동일한 신고를 전부 제외하기 위해 report를 HashSet의 형태로 바꿔준다.
첫번째 for문에서 바꿔준 신고내역을 기반으로 신고자가 누구를 신고했는지 저장해둔 reportMap과 신고대상이 몇번이나 신고당했는지를 적어둔 reportedMap에 정리해주고
이후에 reportedMap에 등록된 신고 횟수가 기준을 넘어서면 reportMap을 참고해 그 사람을 신고한 사람들에게 메일 발송횟수를 1씩 증가시켜 정답을 찾았다.
이 문제를 풀면서 HashMap과 HashSet에 대한 공부를 많이 해서 기억에 남는다.
HashMap에 값이 존재하면 아무 동작도 하지 않고 키값이 없을때는 지정한 값을 넣는 putIfAbsent와 키값이 있으면 value를 가져오고 없으면 default로 설정한 값을 가져오는 getOrDefault가 포인트인 문제였다고 생각한다.