✔ 신고 결과 받기
문제 분석하기
HashMap을 사용해 신고 당한 ID와 신고한 ID를 저장한 후,
k보다 많이 신고되었을 경우에 대해 이를 신고한 ID의 횟수를 증가시켜줌
손으로 풀어보기
- HashMap에 신고 당한 ID와 신고한 ID를 저장
- 처음 신고 당한 것이라면 Set을 만들어 신고한 ID와 함께 저장
- 두 번째 신고 당한 것이라면 기존의 Set에 신고한 ID 추가 저장
- HashMap을 돌면서 k보다 많이 신고되었을 경우 신고한 ID에 대해 메일 횟수 증가
- 각 유저가 받은 결과 메일 수를 반환
슈도코드 작성하기
id_list(이용자의 ID)
report(각 이용자가 신고한 이용자의 ID 정보)
k(정지 기준이 되는 신고 횟수)
answer(각 유저별로 처리 결과 메일을 받은 횟수)
map(신고 당한 이용자의 ID와 신고한 이용자의 ID 집합을 가지는 HashMap)
for(r -> report만큼) {
sender(신고한 이용자)
receiver(신고 당한 이용자)
if(처음 신고 당한 것이 아니라면) {
receiver의 map에 sender 추가
}
else {
map에 receiver와 sender를 담은 집합 저장
}
}
for(result -> map.entrySet만큼) {
if(result의 집합의 크기가 k보다 크거나 같다면) {
for(reporter -> result.getValue()만큼) {
index(answer에서 reporter의 인덱스)
answer[index] 증가
}
}
}
answer 반환
코드 구현하기
/**
* 92334) 신고_결과_받기
*/
public class L055_92334 {
// id_list(이용자의 ID)
// report(각 이용자가 신고한 이용자의 ID 정보)
// k(정지 기준이 되는 신고 횟수)
public int[] solution(String[] id_list, String[] report, int k) {
// answer(각 유저별로 처리 결과 메일을 받은 횟수)
int[] answer = new int[id_list.length];
// map(신고 당한 이용자의 ID와 신고한 이용자의 ID 집합을 가지는 HashMap)
Map<String, Set<String>> map = new HashMap<>();
for (String r : report) {
// sender(신고한 이용자)
String sender = r.split(" ")[0];
// receiver(신고 당한 이용자)
String receiver = r.split(" ")[1];
// 처음 신고 당한 것이 아니라면
if (map.containsKey(receiver)) {
// receiver의 map에 sender 추가
map.get(receiver).add(sender);
}
// 처음 신고 당한 것이라면
else {
// map에 receiver와 sender를 담은 집합 저장
Set<String> set = new HashSet<>();
set.add(sender);
map.put(receiver, set);
}
}
for (Map.Entry<String, Set<String>> result : map.entrySet()) {
// result의 집합의 크기가 k보다 크거나 같다면 (k번 이상 신고 당했다면)
if (result.getValue().size() >= k) {
for (String reporter : result.getValue()) {
// index(answer에서 reporter의 인덱스)
int index = Arrays.asList(id_list).indexOf(reporter);
// 신고한 이용자의 메일 횟수인 answer[index] 증가
answer[index] += 1;
}
}
}
// answer 반환
return answer;
}
// 테스트 케이스
public static void main(String[] args) {
L055_92334 solution = new L055_92334();
String[] id_list = { "muzi", "frodo", "apeach", "neo" };
String[] report = { "muzi frodo", "apeach frodo", "frodo neo", "muzi neo", "apeach muzi" };
int k = 2;
int[] result = solution.solution(id_list, report, k);
System.out.println(Arrays.toString(result));
}
}
'Coding Test > Java 알고리즘 실전' 카테고리의 다른 글
[86051] 없는 숫자 더하기 (0) | 2023.12.18 |
---|---|
[87389] 나머지가 1이 되는 수 찾기 (0) | 2023.12.17 |
[118666] 성격 유형 검사하기 (0) | 2023.12.16 |
[131128] 숫자 짝꿍 (0) | 2023.12.15 |
[131705] 삼총사 (0) | 2023.12.15 |