JAVA/Coding Test

[JAVA] 프로그래머스 신고 결과 받기_구현

오늘도개발 2024. 9. 4. 18:17

 

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

 

프로그래머스

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

programmers.co.kr

 

 

접근 : 

 

  - 유저 객체를 생성한 후 유저의 id와 신고횟수, 정지 여부를 필드값으로 가진다.

 

  - 신고가 만약 중복된 내용이 아니라면, Map 에 신고한 유저 Id에 신고 당한 유저의 신고 횟수를 늘리고 저장한다. 

 

  - 신고 당한 유저를 한명씩 확인하면서 K 이상이면 정지를 시킨다.

 

  - 모든 유저를 순회하면서 해당 유저가 신고한 정지한 유저가 있는경우 정답 배열의 카운트를 증가시킨 후 출력한다.

 

 

코드 구현  : 

 

import java.util.*;

class Solution {
    static class User{
        private String name;
        private int reported;
        private boolean ban;

        public User(String name){
            this.name = name;
            this.reported = 0;
            this.ban = false;
        }

        public void increaseReported(){
            this.reported++;
        }

        public void updateBan(boolean ban){
            this.ban = ban;
        }
    }
    public int[] solution(String[] id_list, String[] report, int k) {
        Map<String, List<User>> users = new HashMap<>();
        Map<String, User> reported = new HashMap<>();

        for(String id : id_list) {
            users.put(id, new ArrayList<>());
            reported.put(id, new User(id));
        }

        //신고 처리 
        Set<String> reports = new HashSet<>();
        String[] temp;
        User reported_user;
        for(String r : report){
            if(!reports.add(r)) continue;

            temp = r.split(" ");
            reported_user = reported.get(temp[1]);
            reported_user.increaseReported();
            users.get(temp[0]).add(reported_user);
        }

        //신고 횟수 기준 정지 처리
        for(String id : id_list){
            if(reported.get(id).reported < k) continue;
            reported.get(id).updateBan(true);
        }

        //신고한 회원 기준 정지 메일수 산정
        int[] answer = new int[id_list.length];
        for(int i = 0 ; i < id_list.length ; i++){
            for(User u : users.get(id_list[i])){
                if(u.ban) answer[i]++;
            }
        }
        return answer;
    }
}