본문 바로가기

알고리즘/카카오

2022 KAKAO BLIND RECRUITMENT - 신고 결과 받기

반응형

https://programmers.co.kr/learn/courses/30/lessons/92334

 

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

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

programmers.co.kr


import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;

public class Solution {
	
	public static int[] solution(String[] id_list, String[] report, int k) {
        int[] answer = new int[id_list.length];
        
        HashMap<String, Integer> idx = new HashMap();
        HashMap<String, Integer> user_report_cnt = new HashMap();
        
        
        // 0. 동일 유저신고를 제거
        Set<String> set = new HashSet(Arrays.asList(report));
        
        String[] report_dup_remove = set.toArray(new String[0]);
        
        // 1. 각 유저ID에 index설정
        for(int i=0; i<id_list.length; i++)	{
        	idx.put(id_list[i], i);
        	user_report_cnt.put(id_list[i], 0);
        }
        
        // 2. 유저가 신고한 사람을 관리할 배열
        ArrayList[] user_report_list = new ArrayList[id_list.length];
        
        // 2-1. 배열 초기화
        for(int i=0; i<id_list.length; i++) {
        	user_report_list[i] = new ArrayList();
        }
        
        // 3. report 배열을 돌면서 유저가 신고한 사람들을 업데이트
        // 4. 신고당한 횟수 증가
        for(int i=0; i<report_dup_remove.length; i++) {
        	String[] str_arr = report_dup_remove[i].split(" ");
        	
        	String user = str_arr[0];
        	String reported_user = str_arr[1];
        	
        	// 유저가 신고한사람 업데이트
        	user_report_list[idx.get(user)].add(reported_user);
        	
        	// 신고당한 횟수 1 증가
        	int cnt = user_report_cnt.get(reported_user);
        	user_report_cnt.put(reported_user, cnt+1);
        }
        
//        for(int i=0; i<user_report_list.length; i++) {
//        	System.out.println(id_list[i] + "가 신고한사람들 : " + user_report_list[i]);
//        }
        
//        for(int i=0; i<user_report_cnt.size(); i++) {
//        	System.out.println(id_list[i] + "가 신고당한 횟수 : " + user_report_cnt.get(id_list[i]));
//        }
        
        ArrayList<String> k_up_reported_user = new ArrayList(); 
        
        // k 이상 신고당한 사람 구하기
        for(int i=0; i<id_list.length; i++) {
        	if(user_report_cnt.get(id_list[i]) >= k) {
        		k_up_reported_user.add(id_list[i]);
        	}
        }
        
        // 정답구하기 => 유저가 신고했던 사람들중에 k번이상 신고당한사람이 몇명있나?
        for(int i=0; i<id_list.length; i++) {
        	int cnt = 0;
        	for(int j=0; j<k_up_reported_user.size(); j++) {
        		if(user_report_list[i].contains(k_up_reported_user.get(j))) cnt+=1;
        	}
        	answer[i]=cnt;
        }
        
        // System.out.println(Arrays.toString(answer));
        
        return answer;
    }
}
반응형