코딩/알고리즘

[알고리즘] 프로그래머스 신고결과 받기 Java(자바)

유어노우 2022. 1. 14. 14:45

- 문제

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

 

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

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

programmers.co.kr

 

- 코드 설명

idIdx를 통해 이름과 index번호를 맵핑해 줍니다.

 

User 클래스를 생성해서 거기에 내가 신고한 사람 , 나를 신고한 사람을 저장한 후에

 

내가 k번 이상 신고를 받았으면 suspendedList에 추가했다.

 

이 후 다시한번 User객체를 for문으로 탐색하여 reportList에 suspendedList에 추가된 사람이 있는지 판별하고 

 

idIdx를 통해 알아낸 index 번호를 통해 answer 값을 증가시켜 줍니다!

 

문제 자체는 어렵지 않았지만 어떻게 하면 간결하고 보기 쉽게 짤 수 있을 까 고민을 했습니다..

 

이게 저의 최선이었습니답...

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<>(); //<이름,> Integer 값은 중요하지 않음 
        HashMap<String,Integer> idIdx = new HashMap<String,Integer>(); // <이름, 해당 이름의 User 클래스 idx>
        int idx = 0;

        //Id 별로 User 객체 생성
        for(String name : id_list) {
            idIdx.put(name,idx++);
            users.add(new User(name));
        }

        
        //신고
        for(String re : report){
            String[] str = re.split(" ");
            users.get( idIdx.get(str[0])).reportList.add(str[1]); 
            users.get( idIdx.get(str[1])).reportedList.add(str[0]);
        }
        
        //reportedList의 크기가 k번 이상이면 suspendedList에 추가됨
        for(User user : users){
            if(user.reportedList.size() >= k)
                suspendedList.put(user.name,1);
        }

        //reportList에 suspendedList가 있으면  answer 증가 
         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; // user 이름
    HashSet<String> reportList; //신고한 아이디
    HashSet<String> reportedList; // 누구에게 신고 당했는지 -> 중복신고를 걸러냄
    public User(String name){
        this.name = name;
        reportList = new HashSet<>();
        reportedList = new HashSet<>();
    }
}

 

- 결과