https://programmers.co.kr/learn/courses/30/lessons/92334
문제 분석
- 신고한 유저와 신고당한 유저를 HashMap으로 관리한다.
-> reportMap : 신고당한 유저 관리
신고한 유저(String) - 신고한 유저들 목록(Set) *중복을 제거하기 위해 Set활용
-> reportedMap : 신고당한 유저관리
신고당한 유저(String) - 신고당한 횟수(Integer)
- for문을 통해 각 HashMap들을 초기화한다.
- report의 개수만큼 신고한 사람에게 중복되지 않게 추가할 수 있다면 신고한 유저를 관리하는 Map에 추가하고 신고당한 유저를 관리하는 Map에 신고 횟수를 추가한다.
문제 풀이
1. for문을 통해 각각의 Map을 초기화해준다.
2. 입력받은 report의 길이만큼 for문을 반복하여 신고한 유저를 해당 HashMap에 add해준다. (if문을 통해 중복되어 들어갔는지 확인한다. add의 경우 리턴 타입이 true || false이기 때문에 중복되지않고 잘 들어간 케이스만 신고 횟수를 증가시킨다)
3. for문을 통해 신고당한 횟수가 k번 이상인 경우를 체크하고 만약 k번 미만인 경우 신고한 유저의 HashMap에서 신고한 유저 리스트를 remove메소드를 통해 지워버린다.
4. for문을 통해 신고한 유저가 가지고 있는 크기만큼을 정답 배열에 넣어준다.
import java.util.*;
class Solution {
public int[] solution(String[] id_list, String[] report, int k) {
int[] answer = new int[id_list.length];
StringTokenizer st;
Map<String, Set<String>> reportMap = new HashMap<>(); // 신고한 유저 관리 - (신고한 유저, 신고한 유저들)
Map<String, Integer> reportedMap= new HashMap<>(); // 신고당한 유저 관리 - (신고당한 유저, 신고당한 횟수)
for(int i=0;i<id_list.length;i++){
reportMap.put(id_list[i], new HashSet<>());
reportedMap.put(id_list[i], 0);
}
for(int i=0;i<report.length;i++){
st = new StringTokenizer(report[i]);
String from = st.nextToken(); // 신고한 사람
String to = st.nextToken(); // 신고당한 사람
if(reportMap.get(from).add(to)){ // add는 리턴타입이 true || false
reportedMap.put(to, reportedMap.get(to)+1);
}
}
// 신고당한 횟수가 k회 이상인 경우만 체크
for(int i=0;i<report.length;i++){
st = new StringTokenizer(report[i]);
String from = st.nextToken(); // 신고한 사람
String to = st.nextToken(); // 신고당한 사람
if(reportedMap.get(to) < k) {
reportMap.get(from).remove(to);
}
}
for(int i=0;i<id_list.length;i++) {
answer[i] = reportMap.get(id_list[i]).size();
}
return answer;
}
}
'Algorithm > programmers' 카테고리의 다른 글
programmers JadenCase 문자열 만들기 (0) | 2022.04.18 |
---|---|
programmers N개의 최소공배수 (0) | 2022.04.18 |
programmers 로또의 최고 순위와 최저 순위 (0) | 2022.04.10 |
programmers 신규 아이디 추천 (0) | 2022.04.10 |
programmers 숫자 문자열과 영단어 (0) | 2022.04.10 |