- 프로래머스 Lv1 신고 결과 받기 문제
- 해당 문제의 난이도 상승 원인
- 실행 시간 제한이 10초 이내로 설정되어 불필요한 반복등을 배제해야함
- 동일 유저에 대한 중복 신고를 최대 1로 제한해야 함
- 해당 문제를 해결한 방법
- 'Set'을 사용하여 중복 요청들어 올 때 추가로 카운팅하지 않도록 제한
- 한 사람을 Map 요소 하나도 두어 그 사람이 신고했던 사람, 그 사람을 신고했던 사람들의 정보들을 저장
- 문제의 핵심
- 불필요한 반복을 피하고 딱 필요한 데이터만 사용해야 함
- 이 문제의 목적
- 불필요한 동작 등을 고려하여 코드를 짜도록 학습
import java.util.*;
class ReceiveReportResults {
public int[] solution(String[] id_list, String[] report, int k) {
int[] answer = {};
Map<String, Set<String>> reportHis = new HashMap<>(); // 이력 저장소
Map<String, Integer> cntMap = new HashMap<>(); // 카운팅 저장소
for(String id : id_list){
reportHis.put(id, new HashSet<>());
}
for(String r : report){
String[] sArr = r.split(" ");
String cause = sArr[0];
String effect = sArr[1];
if(reportHis.get(cause).add(effect)){
cntMap.put(effect, cntMap.getOrDefault(effect, 0) + 1);
}
}
List<Integer> answerList = new ArrayList<>();
for(String id : id_list){
int f_report_cnt = 0;
Set<String> resportHisSet = reportHis.get(id);
if(resportHisSet != null){
for(String target : resportHisSet){
if(cntMap.getOrDefault(target, 0) >= k){
f_report_cnt++;
}
}
answerList.add(f_report_cnt);
}
}
answer = answerList.stream().mapToInt(Integer::intValue).toArray();
return answer;
}
public static void main(String[] args) {
String[] id_list = {"muzi", "frodo", "apeach", "neo"};
String[] report = {"muzi frodo", "apeach frodo", "frodo neo", "muzi neo", "apeach muzi"};
int k = 2;
ReceiveReportResults rrr = new ReceiveReportResults();
System.out.println("결과 : " + Arrays.toString(rrr.solution(id_list, report, k)));
}
}