https://programmers.co.kr/learn/courses/30/lessons/92334?language=java
import java.util.*;
class Solution {
public int[] solution(String[] id_list, String[] report, int k) {
//한 사람이 여러번 똑같은 사람을 신고하는건 의미가 없으므로 distinct로 중복을 다 제거한다.
report = Arrays.stream(report).distinct().toArray(String[]::new);
//map 은 순서를 보장하지 않으므로 LinkedHashMap 을 사용해서 순서를 보장한다.
//result는 id_list 와 같은 순서여야하기 때문.
Map<String, Integer> result = new LinkedHashMap();
Map<String, ArrayList<String>> reportMap = new HashMap<>();
for(int i =0; i< id_list.length; i++){
//먼저 결과가 들어갈 result 를 id와 함께 0 으로 초기화 한다.
result.put(id_list[i] , 0);
}
for(int i =0 ; i< report.length ; i++){
//신고자와 신고당한 사람을 나눈다.
String[] arryReport = report[i].split(" ");
String reporter = arryReport[0];
String target = arryReport[1];
//reportMap에서 신고당한 사람 key에 신고한 사람의 이름을 Arraylist에 추가한다.
//이렇게 만들면 신고당한 사람이 몇명한테 신고당했는지 size로 값을 알 수 있게 된다.
if(reportMap.containsKey(target)){
reportMap.get(target).add(reporter);
}else{
//처음 값을 넣는 경우에는 새로운 arraylist를 만들고
//신고한 사람의 이름을 집어넣고 map 에 put 한다.
ArrayList<String> temp = new ArrayList<String>();
temp.add(reporter);
reportMap.put(target ,temp );
}
}
//reportMap의 키를 전부 불러온다. 즉 신고당한 사람의 이름을 전부 가져온다.
for(String temp : reportMap.keySet()){
//해당하는 이름을 신고한 사람들의 size를 알아오고 k와 비교한다.
if(reportMap.get(temp).size() >= k){
//reportMap의 value 로 가지는 string list의 원소를 i로 받아오는것
for(String i : reportMap.get(temp)){
//k번 이상 신고당한 사람을 신고한 사람의 이름을 i 로 가져오게 된다.
//result에 신고한 사람에게 정지 받았다는 메일을 보내주기 때문에 1이 더해진다.
result.put(i , result.getOrDefault(i , 0) +1);
}
}
}
return result.values().stream().mapToInt(Integer::intValue).toArray();
}
}
반응형
'알고리즘' 카테고리의 다른 글
프로그래머스 - 카드뭉치 (0) | 2024.08.12 |
---|---|
프로그래머스 - 혼자서하는 틱택토 (0) | 2024.08.12 |
프로그래머스 - 대충 만든 자판 (0) | 2024.08.11 |
프로그래머스 - 리코쳇 로봇 (0) | 2024.08.11 |
1이 될때까지 최소 연산 횟수 (0) | 2021.08.21 |
알고스팟 - 소풍 (0) | 2020.06.15 |
알고스팟 - 보글게임(무식하게 풀기방법만 적용) (0) | 2020.06.15 |
프로그래머스 - 네트워크 (0) | 2020.04.19 |