본문 바로가기

알고리즘 문제풀이/프로그래머스 Level 1

[2022 KAKAO BLIND RECRUITMENT/Java] 신고 결과 받기

# 문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/92334

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

목차

 

나의 풀이 포인트
  1. 한 유저가 특정 유저를 여러 번 신고할 수 있지만 신고 횟수는 1회로 처리된다는 점 → Set
  2. a 유저가 b 유저를 신고하고 끝나는 게 아니라, a유저가 신고한 b 유저의 총 신고당한 횟수 알아야 한다는 점
    → <신고한 사람, 신고한 목록>, <신고당한 사람, 신고한 목록> 양 방향으로 생각

 

나의 문제풀이
import java.util.*;

class Solution {
    public int[] solution(String[] id_list, String[] report, int k) {
        int[] answer = new int[id_list.length];
        Map<String, Set<String>> userMap = new HashMap<>(); // <신고한 사람, 신고한 목록>
        Map<String, Set<String>> reportMap = new HashMap<>(); // <신고당한 사람, 신고한 목록>
        
        // #1. 유저목록, 신고당한목록 초기화
        for (String id : id_list) {
            userMap.put(id, new HashSet<String>());
            reportMap.put(id, new HashSet<String>());
        }
        for (String r : report) {
            String[] ids = r.split(" ");
            String reporter = ids[0]; // 신고한 사람
            String reported = ids[1]; // 신고당한 사람
            
            // <신고한 사람, 신고한 목록>
            Set<String> tempUserMap = userMap.get(reporter);
            tempUserMap.add(reported);
            // <신고당한 사람, 신고한 목록>
            Set<String> tempReportMap = reportMap.get(reported);
            tempReportMap.add(reporter);
        }
        
        // #2. 처리
        for (int i = 0; i < id_list.length; i++) {
            String id = id_list[i];
            int cnt = 0;
            
            // 유저가 신고한 id 순회 
            for (String reported : userMap.get(id)) {
                int size = reportMap.get(reported).size(); // 신고당한 유저의 총 신고당한 횟수
                
                // 신고당한 횟수가 k번 이상이면 신고한 유저한테 메일발송 됨 -> answer 카운트 증가
                if (size >= k) {
                    cnt++;
                }
            }
            
            answer[i] = cnt;
        }
        
        return answer;
    }
}

 

 

나의 문제풀이 2 (객체지향적)
import java.util.*;

class Solution {
    public int[] solution(String[] id_list, String[] report, int k) {
        int[] answer = new int[id_list.length];
        ArrayList<User> users = new ArrayList<>();
        HashMap<String,Integer> suspendedList = new HashMap<>(); //<이름>
        HashMap<String,Integer> idIdx = new HashMap<String,Integer>(); // <이름, 해당 이름의 User 클래스 idx>
        int idx = 0;

        for(String name : id_list) {
            idIdx.put(name,idx++);
            users.add(new User(name));
        }

        for(String re : report){
            String[] str = re.split(" ");
            //suspendedCount.put(str[0], suspendedCount.getOrDefault(str[0],0)+1);
            users.get( idIdx.get(str[0])).reportList.add(str[1]);
            users.get( idIdx.get(str[1])).reportedList.add(str[0]);
        }

        for(User user : users){
            if(user.reportedList.size() >= k)
                suspendedList.put(user.name,1);
        }

         for(User user : users){
             for(String nameReport : user.reportList){
                 if(suspendedList.get(nameReport) != null){
                     answer[idIdx.get(user.name)]++;
                 }

             }
        }

        return answer;
    }
}

class User{
    String name;
    HashSet<String> reportList;
    HashSet<String> reportedList;
    public User(String name){
        this.name = name;
        reportList = new HashSet<>();
        reportedList = new HashSet<>();
    }
}

 

 

프로그래머스 다른사람 풀이 참고(hschae , 허도영 , - , 배경수 외 8 명 / 링크)
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;

class Solution {
    public int[] solution(String[] id_list, String[] report, int k) {
        List<String> list = Arrays.stream(report).distinct().collect(Collectors.toList());
        HashMap<String, Integer> count = new HashMap<>();
        for (String s : list) {
            String target = s.split(" ")[1];
            count.put(target, count.getOrDefault(target, 0) + 1);
        }

        return Arrays.stream(id_list).map(_user -> {
            final String user = _user;
            List<String> reportList = list.stream().filter(s -> s.startsWith(user + " ")).collect(Collectors.toList());
            return reportList.stream().filter(s -> count.getOrDefault(s.split(" ")[1], 0) >= k).count();
        }).mapToInt(Long::intValue).toArray();
    }
}

Stream 이용해서 한 거... 기억해두자~~