문제
https://programmers.co.kr/learn/courses/30/lessons/92334
접근
제한시간은 [정확성 테스트: 10초]만 존재하므로 불필요한 반복만 줄이면 된다.
네 개의 Hash 자료구조를 사용했다.
1. abuseCntMap: 아이디 별 신고 당한 횟수 Map
2. abuseAndReportIdMap: 각 신고당한 사람이 어떤 사람(아이디)에게 신고 당했는지 기록
3. reportAndAbuseIdMap: 신고한 사람이 어떤 사람(아이디)를 신고했는지 기록
4. scoreCntMap: 신고한 사람이 받은 결과 메일 수
*report: 신고한 사람 / abuse: 신고당한 사람
input으로 받은 report 배열을 순회하며 1,2,3 자료구조를 채운 뒤,
abuseCntMap을 순회하며 신고당한 횟수가 k 이상인 id에 대해,
abuseAndReportIdMap에서 신고한 사람들의 id를 가져온 후,
scoreCntMap에 메일 받은 수를 더해준다.
Code
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
class Solution {
public int[] solution(String[] id_list, String[] report, int k) {
int[] answer = new int[id_list.length];
Map<String, Integer> abuseCntMap = new ConcurrentHashMap<>();
Map<String, List<String>> abuseAndReportIdMap = new ConcurrentHashMap<>();
Map<String, Map<String, Boolean>> reportAndAbuseIdMap = new ConcurrentHashMap<>();
Map<String, Integer> scoreCntMap = new ConcurrentHashMap<>();
for (String record : report) {
String reportId = record.split(" ")[0];
String abuseId = record.split(" ")[1];
if (!reportAndAbuseIdMap.containsKey(reportId)) {
reportAndAbuseIdMap.put(reportId, new ConcurrentHashMap<>());
}
if (!reportAndAbuseIdMap.get(reportId).containsKey(abuseId)) {
reportAndAbuseIdMap.get(reportId).put(abuseId, true);
if (!abuseCntMap.containsKey(abuseId)) {
abuseCntMap.put(abuseId, 1);
} else {
abuseCntMap.put(abuseId, abuseCntMap.get(abuseId) + 1);
}
if (!abuseAndReportIdMap.containsKey(abuseId)) {
List<String> reportIds = new ArrayList<>();
reportIds.add(reportId);
abuseAndReportIdMap.put(abuseId, reportIds);
} else {
abuseAndReportIdMap.get(abuseId).add(reportId);
}
}
}
abuseCntMap.keySet().forEach(abuseId -> {
if (abuseCntMap.get(abuseId) >= k) {
abuseAndReportIdMap.get(abuseId).forEach(reportId -> {
if (!scoreCntMap.containsKey(reportId)) {
scoreCntMap.put(reportId, 1);
} else {
scoreCntMap.put(reportId, scoreCntMap.get(reportId) + 1);
}
});
}
});
for (int i = 0; i < id_list.length; i++) {
answer[i] = scoreCntMap.getOrDefault(id_list[i], 0);
}
return answer;
}
}
'Algorithms' 카테고리의 다른 글
[Algorithms] BFS 코드 구조 (0) | 2022.06.12 |
---|---|
[Codility] PermMissingElem (0) | 2022.02.28 |
[Codility] OddOccurrencesInArray (0) | 2022.02.26 |
[Codility] CyclicRotation (0) | 2022.02.24 |
[Codility] BinaryGap (0) | 2022.02.22 |