1. 문제
2. 문제 해결 논리
- 문제 이해
- 주어진 것
- String[] id_list //유저 Id 배열
- String[] report //신고 정보(신고자, 피 신고자) 배열
- int k // 정지 기준 신고 횟수
- 요구되는 것
- int[] //각 유저 별 신고 처리 메일 발송 횟수 배열
- 주어진 것
- 데이터 구조 결정
- Map 구조 사용
- 키-값 저장 : 각 유저 별(Key) 유저 정보(Value, 피 신고 횟수 or 신고자 목록) -> Map 사용
- 빠른 조회 속도 : HashMap(해시 함수 이용) -> 조회 속도 빠름
- 유연한 사이즈 : Map은 동적으로 크기 조절 가능 -> 유저의 수가 변동될 때에도 구조 유지 가능
- Map 구조 사용
- 알고리즘 설계
- 각 유저 별 유저 정보를 위한 Map 생성
- 각 유저 Id와 인덱스를 저장할 Map1 생성
- 피 신고자와 신고자 목록을 저장할 Map2 생성
- 피 신고자와 피 신고 횟수를 저장할 Map3 생성
- 유저 목록(배열 id_list)을 활용하여 Map1 초기화
- 신고 정보(배열 report)를 활용하여 Map2, Map3 초기화
- Map2와 Map3를 활용
- k번 이상 신고된 Id를 찾아서 정지 처리 결과 메일 발송 횟수를 배열에 저장
- 결과 배열 반환
- 각 유저 별 유저 정보를 위한 Map 생성
3. 코드 구현
import java.util.*;
class Solution {
public int[] solution(String[] id_list, String[] report, int k) {
int n = id_list.length;
int[] answer = new int[n];
Map<String, Integer> userIndex = new HashMap<>(); //유저 목록
Map<String, Set<String>> reportedss = new HashMap<>(); //피 신고자와 신고자
Map<String, Integer> reportCount = new HashMap<>(); //피 신고자와 피 신고 횟수
//유저 목록 Map으로 생성
for (int i = 0; i < n; i++) {
userIndex.put(id_list[i], i);
}
//신고 정보 Map(reportedss, reportCount)으로 기록
for (String rep : report) {
String[] users = rep.split(" ");
String reporter = users[0];
String reported = users[1];
//피 신고자가 처음 신고된다면 HashSet 생성
if (!reportedss.containsKey(reported)) {
reportedss.put(reported, new HashSet<>());
}
//피 신고자가 신고된다면(동일 신고자 중복 신고 횟수 제거 포함) 신고 횟수 추가
if (reportedss.get(reported).add(reporter)) {
reportCount.put(reported, reportCount.getOrDefault(reported, 0) + 1);
}
}
//피 신고자의 피 신고 횟수가 k이상이라면(=게시판 이용 정지 처리됐다면)
//Set으로 신고자 목록 생성
for (String key : reportCount.keySet()) {
if (reportCount.get(key) >= k) {
//신고자 목록의 각 신고자마다 처리 메일 발송 횟수를 answer 배열에 저장
Set<String> repUsers = reportedss.get(key);
for (String reporter : repUsers) {
int idx = userIndex.get(reporter);
answer[idx]++;
}
}
}
return answer;
}
}
* Reference
https://school.programmers.co.kr/learn/courses/30/lessons/92334
반응형
'PS > Programmers' 카테고리의 다른 글
[level1, Stack/Queue] 같은 숫자는 싫어 (0) | 2023.03.20 |
---|---|
[level1, 유클리드 호제법] 최대공약수와 최소공배수 (0) | 2023.03.19 |
[level1, array] 행렬의 덧셈 (0) | 2023.03.19 |
[level1, sort] 문자열 내림차순으로 배치하기 (0) | 2023.03.19 |
[level1, StringBuilder] 수박수박수박수? (0) | 2023.03.18 |