프로그래머스 (Java) 신고 결과 받기
문제 이름:
신고 결과 받기
문제 설명:
신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다.
무지가 개발하려는 시스템은 다음과 같습니다.
각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.
신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.
한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.
k번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다.
유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다.
코드 :
import java.util.*;
class Solution {
public int[] solution(String[] id_list, String[] report, int k) {
// id_list의 인덱스를 유저 ID와 매핑
int n = id_list.length;
int[] mailCount = new int[n];
int[] reportCount = new int[n];
boolean[][] reportMatrix = new boolean[n][n];
// 유저 ID를 인덱스로 매핑
Map<String, Integer> idIndexMap = new HashMap<>();
for (int i = 0; i < n; i++) {
idIndexMap.put(id_list[i], i);
}
// 신고 데이터를 처리
for (String rep : report) {
String[] parts = rep.split(" ");
String reporter = parts[0];
String reported = parts[1];
int reporterIndex = idIndexMap.get(reporter);
int reportedIndex = idIndexMap.get(reported);
if (!reportMatrix[reporterIndex][reportedIndex]) {
reportMatrix[reporterIndex][reportedIndex] = true;
reportCount[reportedIndex]++;
}
}
// 신고 횟수가 k 이상인 유저들을 신고한 유저에게 메일 발송
for (int i = 0; i < n; i++) {
if (reportCount[i] >= k) {
for (int j = 0; j < n; j++) {
if (reportMatrix[j][i]) {
mailCount[j]++;
}
}
}
}
return mailCount;
}
}
신고 받은 숫자 배열, 매일을 받은 숫자 배열, 한 사람당 신고횟수를 확인하는 배열의 길이를 만들기 위해 사용자 아이디의 배열 길이를 n에 저장한다.
유저 아이디를 넣기 위해 map의 key값을 아이디로 value값을 i로 해서 인덱스 값을 넣어준다.
(불린 2차 배열을 사용하기 위해 map을 사용했다. 불린 배열은 한 사람이 신고를 했을 때를 나타내는 배열이다.)
신고 데이터를 처리하기 위해 반복문으로 report의 데이터를 하나씩 꺼내와서 공백을 기준으로 잘라서 배열에 담는다.
배열에 담긴 데이터를 신고 한 사람, 신고 당한사람으로 나눈다.
map에 담긴 신고자의 인덱스를 구한다.
똑같이 map에 담긴 신고당한 사람의 인덱스를 구한다.
나온 인덱스를 이용해서 그 자리에 값이 false이면 ture로 바꾼다.
바뀌면 reportCount 배열에 신고당한 사람의 인덱스 자리를 1증가 시켜준다.
마지막 신고 횟수가 k이상인 유저들을 신고한 유저에게 매일을 발송해야한다.
반복문을 사용해서 리포트카운트 배열의 값 중에 k보다 같거나 큰 경우에
reportMatrix 배열의 자리가 true이면 mailCount의 배열의 값을 1증가 시킨다.