728x90
반응형
https://school.programmers.co.kr/learn/courses/30/lessons/92334
💬 문제 접근
- 중복을 제거하기 위해 HashSet과 HashMap을 사용한다.
- 2명 이상 User를 신고하면 계정이 정지가 되고, 신고한 User에게 메일을 보낸다.
- 따라서 HashMap에 신고당한 User와 신고한 User의 정보가 담겨야 한다.
- 신고한 User는 여러명이 될 수 있기 때문에 신고한 User가 중복이 되지 않도록 HashMap 안에 HashSet을 포함해 준다.
💡 문제 풀이
// user의 순서 저장
HashMap<String, Integer> user_id = new HashMap<>();
// 각 user별로 자신을 신고한 user의 set 저장
HashMap<String, HashSet<String>> user_report = new HashMap<>();
// HashMap 초기화
for(int i = 0; i< id_list.length; i++) {
user_id.put(id_list[i], i); // 입력되는 user_id 순서대로 index 지정
user_report.put(id_list[i], new HashSet<>()); // user_id별로 HashSet 생성
}
- 출력문은 answer [ ] 형태이므로, 인자로 전달받은 id_list의 user_id 값을 String 형태로 저장하고, Integer 값으로 i 값을 통해 answer[ ]에 순서대로 담아줄 index 설정을 해준다.
- 'user_report' HashMap은 각 user의 id를 저장하고, 초기화를 통해 신고한 user_id가 담길 HashSet을 생성해 준다.
// user 자신을 신고한 user의 이름 저장
for(String s : report) {
String[] sarr = s.split(" ");
user_report.get(sarr[1]).add(sarr[0]);
}
// String[] report = {"muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"};
- 인자로 전달받은 report 배열의 String 문자열을 분리하여 user_report HashMap에 넣어준다.
- 신고를 당한 user에게 신고를 한 user의 id를 넣어주는 것이기 때문에 헷갈리니 주의가 필요하다.
// user별로 신고당한 횟수가 k 보다 많으면 메일 보내기
for(int i = 0; i<id_list.length; i++) {
// 자신을 신고한 user set 가져오기
HashSet<String> hashSet = user_report.get(id_list[i]);
System.out.println("신고한 user : " + hashSet + " -> 신고당한 user : " + id_list[i]);
// 신고한 user가 k 이상이면
if(hashSet.size() >= k) {
for(String s : hashSet) {
// user_id 별로 초기화를 통해 index를 설정해 주었기 때문에
// answer[]의 user index 순서에 맞게 값 증가
answer[user_id.get(s)]++;
}
}
}
- id_list [0] 번째 일 때 : muzi -> muzi를 신고한 유저는 apeach
- id_list [1] 번째 일 때 : frodo -> frodo를 신고한 유저는 muzi, apeach
- id_list [2] 번째 일 때 : apeach -> apeach를 신고한 유저는 없음
- id_list [3] 번째 일 때 : neo -> neo를 신고한 유저는 muzi, frodo
- hashSet에는 신고한 user의 id가 담겨있기 때문에 hashSet의 size()가 k보다 같거나 크다면 계정이 정지되고 hashSet에 담겨있는 user들에게 메일이 전송된다.
- muzi, apeach, frodo, neo에게는 위에서 초기화를 통해 설정한 value 값이 있기 때문에 user_id.get(s)를 수행하면 id_list와 동일한 배열 index 순서대로 user_id 값을 얻게 되고, 조건문에 만족하는 것만 값이 증가된다.
⭐️ 코드
import java.util.*;
public class Pro_CT_67 {
// 신고 결과 받기
public int[] solution(String[] id_list, String[] report, int k) {
int[] answer = new int[id_list.length];
// user의 순서 저장
HashMap<String, Integer> user_id = new HashMap<>();
// 각 user별로 자신을 신고한 user의 set 저장
HashMap<String, HashSet<String>> user_report = new HashMap<>();
// HashMap 초기화
for(int i = 0; i< id_list.length; i++) {
user_id.put(id_list[i], i); // 입력되는 user_id 순서대로 index 지정
user_report.put(id_list[i], new HashSet<>()); // user_id별로 HashSet 생성
}
System.out.println("### HashMap 초기화 ###");
System.out.println("###### user_id ######");
user_id.forEach((key, value) -> {
System.out.println(key + " : " + value);
});
System.out.println("###### user_report ######");
user_report.forEach((key, value) -> {
System.out.println(key + " : " + value);
});
// user 자신을 신고한 user의 이름 저장
for(String s : report) {
String[] sarr = s.split(" ");
user_report.get(sarr[1]).add(sarr[0]);
}
System.out.println("###### 입력 후 user_report ######");
System.out.println("# 신고당한 user : 신고한 user #");
user_report.forEach((key, value) -> {
System.out.println(key + " : " + value);
});
System.out.println("####### 신고한 user가 신고당한 user 출력 #######");
// user별로 신고당한 횟수가 k 보다 많으면 메일 보내기
for(int i = 0; i<id_list.length; i++) {
// 자신을 신고한 user set 가져오기
HashSet<String> hashSet = user_report.get(id_list[i]);
System.out.println("신고한 user : " + hashSet + " -> 신고당한 user : " + id_list[i]);
// 신고한 user가 k 이상이면
if(hashSet.size() >= k) {
for(String s : hashSet) {
// user_id 별로 초기화를 통해 index를 설정해 주었기 때문에
// answer[]의 user index 순서에 맞게 값 증가
answer[user_id.get(s)]++;
}
}
}
return answer;
}
public static void main(String[] args) {
Pro_CT_67 sol = new Pro_CT_67();
// 전체 유저 목록
String[] id_list = {"muzi", "frodo", "apeach", "neo"};
// 유저 ID / 유저가 신고한 ID
String[] report = {"muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"};
// String[] report = {"ryan con", "ryan con", "ryan con", "ryan con"};
int k = 2; // k 번 이상 신고된 유저는 게시판 이용 정지
// 각 유저별로 결과 처리 메일을 받은 횟수를 배열에 담아 return
// 신고당한 유저가 정지되면 신고를 한 유저에게 메일 보냄
System.out.println(sol.solution(id_list, report, k));
}
}
👀 후기
- 솔직히 너무 어렵다
- HashMap 안에 HashSet을 쓸 수 있다는 것을 처음 알았다. 충격 먹었다.
- Python의 Dictionary안에 배열을 담는 것과 비슷하다고 생각도 들었다.
- 열심히 공부하자...!🔥
728x90
반응형
'CodingTest > Programmers' 카테고리의 다른 글
[프로그래머스/Programmers] [1차] 비밀지도 (Java - BinaryString) (0) | 2023.01.06 |
---|---|
[프로그래머스/Programmers] 예산 (Java - 알고리즘) (0) | 2023.01.04 |
[프로그래머스/Programmers] 최대공약수와 최소공배수 (Java - 수학) (0) | 2023.01.03 |
[프로그래머스/Programmers] 문자열 다루기 기본 (Java - 문자열) (2) | 2023.01.02 |
[프로그래머스/Programmers] 햄버거 만들기 (Java - List) (0) | 2022.12.20 |