Algorithm/Programmers

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

ikjo 2022. 2. 16. 01:22

문제 설명

 

 

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

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

programmers.co.kr

 

풀이 : Success

소스 코드

class Solution {
    public int[] solution(String[] id_list, String[] report, int k) {
        // 사용자별 신고당한 건수(Key 사용자, value 신고건수)
        Map<String, Integer> reportedUser = new HashMap<>();
        // 사용자별 신고현황(중복 제거)
        Set<String> reportSet = new HashSet<>(Arrays.asList(report));
        // 사용자별 신고대상(key 사용자, value 신고대상)
        Map<String, String> reportedUserByUser = new HashMap<>();
        // 정지된 사용자 내역
        List<String> stoppedUserList = new ArrayList<>(); 
        // 사용자별 신고대상 정지 처리건수(결과값)
        int[] result = new int[id_list.length]; 

        for (String id : id_list) {
            reportedUser.put(id, 0);
        }

        for (String id : reportSet) {
            String[] users = id.split(" ");
            reportedUserByUser.put(users[0], reportedUserByUser.getOrDefault(users[0], "") + " " + users[1]);
            reportedUser.put(users[1], reportedUser.get(users[1]) + 1);
        }

        for (Map.Entry<String, Integer> entry : reportedUser.entrySet()) {
            if (entry.getValue() >= k) {
                stoppedUserList.add(entry.getKey());
            }
        }

        int i = 0;
        for (String id : id_list) {
            if (reportedUserByUser.containsKey(id)) {
                String[] users = reportedUserByUser.get(id).split(" ");
                for (String user : users) {
                    if (stoppedUserList.contains(user)) result[i]++;
                }
            }
            i++;
        }

        return result;
    }
}

 

풀이 회고

우선 문제를 풀기 위해 다음과 같이 5개의 자료구조를 선언하였습니다.

 

  • 사용자별로 신고당한 건수를 저장하기 위한 HashMap(key : 사용자, value : 신고 건수)
  • 사용자별 신고 현황을 중복 없이 저장하기 위한 HashSet
  • 사용자별 신고 대상을 저장하기 위한 HashMap(key : 사용자, value : 신고 대상)
  • 정지된 사용자 내역을 저장하기 위한 ArrayList
  • 최종 결과값을 저장하기위한 정수형(int) 배열

 

우선 다음과 같이 입력받은 사용자별로 신고당한 건수를 0으로 초기화 시켜주었습니다. 이는 추후에 신고를 받을 때마다 +1을 해주기 위함입니다.

        for (String id : id_list) {
            reportedUser.put(id, 0);
        }

 

중복이 제거된 "사용자별 신고현황 HastSet 자료구조"를 for 반복문을 통해 사용자별로 순회하면서 사용자별로 누구를 신고했는지를 알아내고 이를 "사용자별 신고대상 HashMap 자료구조"에 각각 저장시키도록 했습니다. 또한 신고받은 사용자는 앞서 초기화 했던 "사용자별 신고당한 건수 HashMap 자료구조"에서 건수를 +1 하였습니다.

        for (String id : reportSet) {
            String[] users = id.split(" ");
            reportedUserByUser.put(users[0], reportedUserByUser.getOrDefault(users[0], "") + " " + users[1]);
            reportedUser.put(users[1], reportedUser.get(users[1]) + 1);
        }

 

위 작업이 모두 종료되면 "사용자별 신고당한 건수 HashMap 자료구조"에서 정지가 되는 신고 건수 이상 신고된 사용자들을 "정지된 사용자 내역 ArrayList 자료구조"에 저장시키도록 했습니다.

        for (Map.Entry<String, Integer> entry : reportedUser.entrySet()) {
            if (entry.getValue() >= k) {
                stoppedUserList.add(entry.getKey());
            }
        }

 

이후 최종적으로 신고한 주체(사용자)에게 본인이 신고한 게 몇 건이 처리되었는지를 결과값으로 반환하기 위해 자신이 신고한 대상이(reportedUserByUser.containsKey(id)) 정지 됐는지 확인(stoppedUserList.contains(user))한 후 +1 연산 시켜주도록 했다.

        int i = 0;
        for (String id : id_list) {
            if (reportedUserByUser.containsKey(id)) {
                String[] users = reportedUserByUser.get(id).split(" ");
                for (String user : users) {
                    if (stoppedUserList.contains(user)) result[i]++;
                }
            }
            i++;
        }

        return result;

 

 

참고자료

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