알고리즘

프로그래머스 - 신고 결과 받기

최데브 2022. 3. 21. 21:30

https://programmers.co.kr/learn/courses/30/lessons/92334?language=java 

 

코딩테스트 연습 - 신고 결과 받기

문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의

programmers.co.kr

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();
    }
}
반응형