문제 요약
매개변수로 회원아이디 배열(중복없음),신고 배열(중복처리해야함), 신고횟수제한 을 받아서 신고횟수제한과 같거나 넘을경우 신고자에게 메일을 보내는 횟수를 return 해주는 메서드를 구현해라
코드:
import java.util.*;
class Solution {
public int[] solution(String[] id_list, String[] report, int k) {
int[] answer = new int[id_list.length];//메일을 보낼 숫자 배열
Map<String,Integer>count = new HashMap<>();//매일보낼 사용자id 와 번수
Map<String,HashSet<String>>reportList=new HashMap<>();//중복을 제거한 리포트
for(String id:id_list){ // id의 갯수만큼 id 를 할당하고 초기화 하는 작업
count.put(id,0);
reportList.put(id,new HashSet<>());
}
for(String rp:report){ // 리포트 배열에 공백을기준으로 신고자 신고할 사용자가 들어있기 때문에 split 사용
String[] reportsp =rp.split(" ");
reportList.get(reportsp[1]).add(reportsp[0]); //reportList 에 신고당한 사람,신고자들 로 할당을 해준다.
}
for(String key:reportList.keySet()){ // keySet 으로 전체 키 값을 가져와 반복
HashSet<String>reporters=reportList.get(key); //key 값 으로 신고자들으 가져오고
if(reporters.size()>=k){ // 신고자 수가 보다 크거나 같을경우 신고자들에게 메일을 보내야 하기 때문에
for(String repoter:reporters){
Integer ct=count.get(repoter); //메일보낼 번수를 가져오고
count.put(repoter,++ct); //++를 해준다
}
}
}
for(int i=0;i<answer.length;i++){
answer[i]=count.get(id_list[i]); // return 할 값을 할당 해주면 끝
}
return answer;
}
}
문제해설:
주석을 통해 문제해설을 담아두었지만 해설을 해보겠습니다. 우선 중복을 제거하는 것이 가장 중요합니다. 신고자가 신고할 사람을 여러번 신고하더라도 신고자가 같다면 신고횟수를 1로 하라고 되어있기 때문에 HashSet 을 사용하는 것이 중요합니다. 메일을 보낼 숫자 배열,메일을 보냘 사용자의 id와 번수를 저장 할 map,가장 중요한 중복을 제거한 map 3개를 먼저 선언합니다. 그리고 id_list 만큼 반복을 해줍니다. 이때 for( A : B ) for문을 사용하여 반복하는 배열의 값을 id 로 할당해주고 Map 에 초기화? 해주는 작업을 해줍니다. 그 후 report 의 값을 HashSet 을 이용하여 중복 제거하여 값을 넣어주고 set의 size가 >=k 일 경우 k명 이상의 사용자가 신고를 한 경우이기때문에 신고한 사람에게 메일을 보내야 합니다 .그렇기 때문에 메일보낼 횟수를 추가 해주면 끝 이제 answer 배열에 값 넣어주고 return 하면 문제 해결완료