JAVA
[ 프로그래머스 ] 신고 결과 받기(Java)
Son
2022. 11. 8. 15:47
https://campus.programmers.co.kr/app/courses/15436/curriculum/lessons/132823
- 각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.
- 신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.
- 한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.
con이 ryan을 4번이나 신고했지만 동일한 유저에 대한 신고 횟수는 1회로 처리되므로 메일이 발송되지 않았다
즉 중복인 되는 경우를 없애주기 위해서 HashMap, HashSet 을 사용한다
Set : 데이터를 중복 저장할 수 없고, 입력 순서대로의 저장순서를 보장 받을 수 없는 자료구조
HashSet : Set 인터페이스를 구현. 순서가 필요없는 데이터를 hash table 에 저장. Set 중 가장 성능이 좋고, put() 메소드를 사용해 데이터를 넣는다. HashMap 인스턴스를 사용한다.
HashMap : Map 인터페이스를 구현. key-value 형식의 데이터를 저장. 중복된 key 값을 허용하지 않는다. add() 메소드를 사용해 데이터를 넣는다.
reportedMap : [신고된ID, [신고한ID들]] 로 구성된 HashMap
- key 는 유저ID(신고된ID), value 는 중복 허용을 하지 않는 HashSet 으로 사용
answerMap : [신고된ID, 메일 수] 로 구성된 HashMap
최종적으로 answer 에는 answerMap 의 key 별 value 값의 1차원 배열이 들어간다
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
class Solution {
public static int[] solution(String[] id_list, String[] report, int k) {
int[] answer = {};
answer = new int[id_list.length];
/*
* key 는 유저ID
* value 는 신고한 유저ID의 set 을 가진 map
* 동일한 유저ID에 대한 신고횟수는 1회로 처리하기 때문에 중복 허용을 하지 않는 set 을 value 로 사용
* */
/*Map 형태(key, value)에서 key 값은 String(신고된 아이디) value값은 HashSet 신고한 ID(중복 허용하지 않기위함)*/
Map<String, HashSet<String>> reportedMap = new HashMap<>(); // [신고된ID, [신고한ID]]
Map<String, Integer> answerMap = new HashMap<>(); // [신고된Id, 메일 수]
/* 1. Map 초기화 */
for (int i = 0; i < id_list.length; i++) {
HashSet<String> reportingId = new HashSet<>(); // 신고한ID
reportedMap.put(id_list[i], reportingId); // 유저ID, 신고한ID 초기 세팅
answerMap.put(id_list[i], 0); // 메일 수는 모두 0 으로 초기화
}
/*
* 2. 신고 기록 세팅 report 는 "신고한ID 신고된ID" 로 구성됨
*/
for (String s : report) {
String[] reportStr = s.split(" ");
String reportingID = reportStr[0]; // 신고한ID
String reportedID = reportStr[1]; // 신고된ID
reportedMap.get(reportedID).add(reportingID); // 신고된ID 를 key 값으로 신고한ID 배열을 value 로 새팅
}
/*
* 3. 유저가 받은 이용 정지 결과 메일 세팅
*/
for (String reportedUser : reportedMap.keySet()) { // reportedUser 는 신고된ID유저
HashSet<String> userForSend = reportedMap.get(reportedUser); // reportedUser(신고된유저)를 신고한 유저
if (userForSend.size() >= k) { // 신고된 횟수가 K번 이상일 경우
for (String userId : userForSend) {
answerMap.put(userId, answerMap.get(userId) + 1); // answerMap 에 신고된Id 별 메일 수 넣기
}
}
}
/*
* 4. 유저ID 별 받은 메일 수를 answer 에 세팅
*/
for (int i = 0; i < id_list.length; i++) {
answer[i] = answerMap.get(id_list[i]);
System.out.println(answer[i]);
}
return answer;
}
}