<문제>
각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.
신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.
한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.
k번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다.
유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다.
<해결 방법>
class Solution {
public int[] solution(String[] id_list, String[] report, int k) {
int[] answer = new int[id_list.length];
return answer;
}
}
--> 기초틀
여기서 기본적으로 report는 신고자는 여러번 신고를 할 수 있으나, 같은 신고자가 같은 사람을 여러번 신고한다면
중복을 제거해야 합니다.
배열을 중복 제거하게 만들어야한다면 HashSet을 제일 먼저 떠올렸습니다.
<HashMap의 특징>
Map은 키-값 쌍으로 데이터를 저장하는 자료구조입니다.
키(key)와 값(value)이 한 쌍으로 연결되어 있으며, 키는 고유해야 합니다.
즉, 우리가 해결해야 하는 한사람이 신고하는 아이디를 키값으로 넣고 값에는 신고한 사람을 넣으면 되겠죠?
일단 그렇게 생각을 해봅시다..!
<Arrays.asList()>
new ArrayList<>()와 Arrays.asList()는 다른 클래스입니다!!!?!
한번 배열이 만들어지면 추가나 삭제될 일이 없을때 Arrays.asList()를 사용합니다.
배열의 size가 변하면 안 되거나 변할 필요가 없을 때 Arrays.asList()를 사용하는것이 좋겠죠?
Arrays.asList()에서 값을 변경하고 싶을 때에는?
String[] str = {"a", "b", "c"};
List<String> list = Arrays.asList(str);
list.set(1, "jju"); // ["a", "jju", "c"]
이렇게 set을 이용해서 변경 할 수 있습니다.
<Set>
Set은 중복을 허용하지 않는 자료구조로, 유일한 요소들을 저장하는 컬렉션입니다.
그렇다면 기본 틀에서 들어오는 String[] report 를 중복을 제거하기 위한 set에 넣어줄 필요가 있겠군요!
이제 기초적인 사용할 틀을 보았으니 코드로 봐보겠습니다.
import java.util.*;
class Solution {
public int[] solution(String[] id_list, String[] report, int k) {
int[] answer = new int[id_list.length];
//신고한 이용자와 해당 이용자가 신고한 이용자들의 관계를 저장하는 맵
Map <String,Set<String>> memReportInfoMap = new HashMap<>();
//신고당한 이용자와 해당 이용자의 신고 횟수를 저장하는 맵
Map <String, Integer> memReportedCntMap = new HashMap<>();
//report 배열을 리스트로 변환하고,
//HashSet의 생성자에 전달하여 중복된 요소를 제거한 Set을 생성.
Set<String> reportSet = new HashSet<>(Arrays.asList(report));
//반복문을 통해 신고자와 신고 당한이를 분리시킴.
for (String reportInfo : reportSet) {
String[] reportInfoArray = reportInfo.split(" ");
String reporter = reportInfoArray[0];
String reported = reportInfoArray[1];
memReportInfoMap.computeIfAbsent(reporter, key -> new HashSet<>()).add(reported);
memReportedCntMap.put(reported, memReportedCntMap.getOrDefault(reported, 0) + 1);
}
//reporterInfoMap에서 id를 키로하여 값을 가져.
//해당하는 값이 없는 경우 Collections.emptySet()을 사용하여 빈 Set을 반환.
for (int i = 0; i < id_list.length; i++) {
String id = id_list[i];
for (String reported : memReportInfoMap.getOrDefault(id, Collections.emptySet())) {
if (memReportedCntMap.getOrDefault(reported, 0) >= k) {
answer[i]++;
}
}
}
return answer;
}
}
<느낀점>
맵과 셋의 활용 방법은 무궁무진하다...
더 공부하자!
이해하고 적는 시간 무려 3시간...!
정처기 공부도 해야지...?
코드 집착하기...
오늘 자바 공부 완료!
'주니어 기초 코딩공부 > JAVA_programmers_코딩테스트' 카테고리의 다른 글
[PCCE] 프로그래머스 자바 기초 04 병과 분류 (0) | 2024.09.20 |
---|---|
[PCCE] 프로그래머스 자바 기초 01 문자 출력 (0) | 2024.09.19 |
자연수 뒤집어 배열로 만들기_programmers_lev01_str.charAt() (0) | 2023.07.01 |
문자열 내 p와 y의 개수_programmers_lev01_toCharArray (2) | 2023.06.30 |
자릿수 더하기_programmers_lev01_정수의 합 (0) | 2023.06.20 |