[プログラマー(Programmers)]レポート結果の取得(java)/202 KAKAO BLIND RECRUIMENT


こんにちは!今日はプログラマーから通報を受けた結果について質問します.この問題は2022年にKAKAO BLIND RECRUITMENTによって提起された.
1)問題リンク
https://programmers.co.kr/learn/courses/30/lessons/92334
2)問題を解く
✔キー:レポートIDを生成し、value:レポートIDマッピング
報告されたIDがkeyであり、報告されたIDがvalueであるHashMapが生成される.この場合、1つのIDで通報した人が何人かいるかもしれませんが、1人で何度も同じIDを通報しても、1回しか通報しません.したがって、HashMapのキーはStringであり、valueはString Setとして宣言され、重複アラームを防止する.
✔停止したユーザリストの作成(finalStopped)
k回以上の通報を受けた人は停止されます.上に作成したhashMap(ReportedMap)では、valueに格納されているsetのサイズがkより大きいことがわかります.setsizeがkより大きい場合は、リストで停止するユーザの名前を保存します.
✔受信者リストの生成
停止した人はメールを受け取った人とは違います.メールを受け取った相手は「他の通報が止まった人」.したがって、finalStopped Listに格納されている停止済みユーザをキー値として、reportedMapの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)感じ
リストとHashMapの資料構造が乱発しているような気がします.特に、最後にmailList hashMapを宣言する必要はありません.後で時間がある時Code Refactoringをします