해당 문제는 여기에서 확인하실 수 있습니다.
이 문제는 신고 시스템을 구현하는 문제로, 주어진 조건에 맞춰 유저들이 받은 메일 수를 계산하는 것이 목표입니다. 문제를 해결하기 위해서는 각 유저가 신고한 유저와 그 유저가 신고받은 횟수를 효율적으로 처리할 필요가 있습니다. 그 과정을 단계별로 설명하겠습니다.
첫 번째로, 유저들이 신고한 대상과 그 신고 정보가 중복되지 않도록 처리해야 합니다. 예를 들어, 한 유저가 동일한 유저를 여러 번 신고하더라도 신고 횟수는 1회로 처리해야 합니다. 이를 위해 각 유저가 신고한 유저들을 집합(Set)으로 관리하여 중복을 제거합니다.
두 번째로, 각 유저가 신고한 유저가 k번 이상 신고를 받은 경우에만 해당 유저를 정지시키고, 그 유저에게 신고한 다른 유저들에게 메일을 보내야 합니다. 신고받은 횟수를 세는 방식으로 처리하면 됩니다. 신고받은 횟수가 k번 이상이면 해당 유저는 정지되고, 그 유저를 신고한 사람들에게 메일을 발송하게 됩니다.
마지막으로, 결과적으로 각 유저가 받은 메일의 수를 반환해야 합니다. 이를 위해 유저별 메일 수를 담을 배열을 준비하고, 정지된 유저를 신고한 유저들의 메일 수를 증가시킵니다. 이를 각 유저 ID의 순서대로 처리하여 최종적으로 배열을 반환합니다.
import java.util.*;
class Solution {
public int[] solution(String[] id_list, String[] report, int k) {
int[] answer = new int[id_list.length];
// 유저 ID에 대한 인덱스를 저장하는 맵 생성
Map<String, Integer> idIndexMap = new HashMap<>();
for (int i = 0; i < id_list.length; i++) {
idIndexMap.put(id_list[i], i);
}
// 각 유저가 신고한 유저들의 집합을 저장하는 맵 생성
Map<String, Set<String>> reportMap = new HashMap<>();
for (String rep : report) {
String[] ids = rep.split(" ");
String reporter = ids[0]; // 신고한 유저
String reported = ids[1]; // 신고당한 유저
// 중복 신고를 방지하기 위해 Set에 신고자를 추가
reportMap.computeIfAbsent(reported, x -> new HashSet<>()).add(reporter);
}
// 신고당한 유저들의 신고 횟수를 확인하고, k번 이상 신고된 경우 처리
for (String reported : reportMap.keySet()) {
Set<String> reporters = reportMap.get(reported);
if (reporters.size() >= k) {
// 신고당한 유저가 k번 이상 신고를 받았다면 신고한 유저들에게 메일 발송
for (String reporter : reporters) {
answer[idIndexMap.get(reporter)]++; // 메일 발송 횟수 증가
}
}
}
return answer; // 각 유저가 받은 메일 수 반환
}
}