[프로그래머스(Programmers)] 신고 결과 받기 (java) /2022 KAKAO BLIND RECRUITMENT

안녕하세요. 오늘은 프로그래머스의 신고 결과 받기문제를 풀어보겠습니다. 이 문제는 2022년 KAKAO BLIND RECRUITMENT에서 출제되었습니다.


1) 문제 링크

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

2) 문제 풀이

✔ key: 신고된 ID, value: 신고한 ID인 map(reportedMap) 생성

신고된 ID가 key이고, 신고한 ID가 value인 HashMap을 생성해줍니다. 이 때, 한 아이디를 신고한 사람이 여러 명 일 수 있고, 한 사람이 같은 아이디를 여러 번 신고하더라도 한 번만 신고한 것으로 칩니다. 따라서 HashMap의 key는 String이고, value는 String Set으로 선언하여 중복신고를 막아줍니다.

✔ 정지된 사람의 list(finalStopped) 생성

신고를 k번 이상 받은 사람은 정지됩니다. 위에서 생성한 hashMap(reportedMap)을 돌면서 value에 저장된 set의 size가 k보다 큰지 확인해줍니다. 만약 set size가 k보다 크다면, list에 정지될 사람의 이름을 저장합니다.

✔ 메일을 받을 사람의 list(mailList)(key: 메일 받게 될 사람 이름, value: 받게 될 메일 총 갯수) 생성

정지된 사람과 메일을 받을 사람은 다릅니다. 메일을 받게 되는 대상자는 "정지된 사람을 신고한 다른 사람들" 입니다. 따라서 finalStopped List에 저장된 정지된 사람들을 key값으로 하여, reportedMap에 저장된 value를 가져오고, 그 value에 저장된 사람들을 mailList hashMap에 저장해줍니다.

3) 전체 코드

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>> reportedMap = new HashMap<>();  //"muzi frodo" -> frodo가 key, muzi가 value

        for (String str : report) {
            String[] reportSplit = str.split(" ");  //muzi frodo -> reportSplit[0] = muzi, reportSplit[1] = frodo
            String reported = reportSplit[1];   //신고 당한 사람
            String reporter = reportSplit[0];   //신고한 사람

            Set<String> set;
            if(reportedMap.containsKey(reported)) {
                set = reportedMap.get(reported);
            } else {
                set = new HashSet<>();
            }
            set.add(reporter);
            reportedMap.put(reported, set);
        }

        List<String> keySet = new ArrayList<>(reportedMap.keySet());
        List<String> finalStopped = new ArrayList<>();
        for (String key : keySet) {
            int reportedSize = reportedMap.get(key).size();

            if (reportedSize >= k) {
                finalStopped.add(key);
            }
        }

        Map<String, Integer> mailList = new HashMap<>();
        for (String stopped : finalStopped) {
            List<String> list = new ArrayList<>(reportedMap.get(stopped));

            for (String str : list) {
                mailList.put(str, mailList.getOrDefault(str, 0) + 1);
            }
        }

        for (int i = 0; i < id_list.length; i++) {
            answer[i] = mailList.getOrDefault(id_list[i], 0);
        }

        return answer;
    }
}

4) 느낀점

List와 HashMap 자료구조들을 너무 남발한 느낌이 든다. 특히 마지막에 mailList hashMap을 선언할 필요가 없어보인다. 나중에 시간 날 때 코드 리팩토링 한 번 해봐야겠다.

좋은 웹페이지 즐겨찾기