[2022 KAKAO BLIND RECRUITMENT] 신고 결과 받기

Wintering·2022년 8월 3일
0

Algorithm

목록 보기
9/16

2022 KAKAO BLIND RECRUITMENT신고 결과 받기

2hours

1. id_list와 그에 따른 메일 발송 결과를 받을 유저 클래스 만들기
key, value 쌍을 지어주기 위해 HashMap 이용

2. report 리스트를 받아 신고당한 유저 클래스 만들기
- HashMap이용, 다만 신고한 유저가 다수이므로, HashMap<String, String[]> 이용
- 중복된 유저를 카운팅 하지 않으므로, 리스트가 아닌 HashSet을 이용해
HashMap<String, HashSet<String>>으로 받기

package Day2;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;

/**
 * 카카오 신고 결과 받기
 * id_list : 이용자의 ID를 받은 배열
 * report : ["신고한 유저" "신고당한 유저"] 배열
 * k : 신고 횟수에 따른 정지 기준
 * answer : 신고한 유저가 받은 결과메일 갯수 배열
 */
public class Solution {
    public static void main(String[] args) {
        String[] id_list = {"muzi", "frodo", "apeach", "neo"};
        String[] report = {"muzi frodo", "apeach frodo", "frodo neo", "muzi neo", "apeach muzi"};
        int k = 2;
        int[] answer = solution(id_list, report, k);
        System.out.println(answer);

    }

    public static int[] solution(String[] id_list, String[] report, int k) {

        HashMap<String, HashSet<String>> reportedUser = new HashMap<>();
        HashMap<String, Integer> result = new HashMap<>();

        int[] answer = new int[id_list.length];

        for (String info : report) {
            String user_reporter = info.split(" ")[0];
            String user_reported = info.split(" ")[1];

            if (reportedUser.containsKey(user_reported)) {
                reportedUser.get(user_reported).add(user_reporter);
            } else {
                reportedUser.put(user_reported, new HashSet<>() {{
                    add(user_reporter);
                }});
                reportedUser.get(user_reported).add(user_reporter);
            }
        }

        for (String user_reported : reportedUser.keySet()) {
            HashSet<String> targetList = reportedUser.get(user_reported);
            if (targetList.size() >= k) {
                Iterator it = targetList.iterator();        // <- *
                while (it.hasNext()) {
                    String userId = (String) it.next();
                    if (result.containsKey(userId)) {
                        result.put(userId, result.get(userId) + 1);
                    } else {
                        result.put(userId, 1);
                    }
                }
            }
        }

        for (int i = 0; i < id_list.length; i++) {
            if (result.get(id_list[i]) == null) {
                answer[i] = 0;
            } else {
                answer[i] = result.get(id_list[i]);
            }
        }

        return answer;
    }
}

헤멘 부분

for (String user_reported : reportedUser.keySet()) {
            HashSet<String> targetList = reportedUser.get(user_reported);
            if (targetList.size() >= k) {
                Iterator it = targetList.iterator();        // <- *
                while (it.hasNext()) {
                    String userId = (String) it.next();
                    if (result.containsKey(userId)) {
                        result.put(userId, result.get(userId) + 1);
                    } else {
                        result.put(userId, 1);
                    }
                }
            }
        }
  1. Iterator로 값을 꺼내는 과정에서 while문 바깥에 Iteratior it을 미리 선언하지 않고, while문 안쪽에서 바로 값을 꺼내서, 같은 값이 무한으로 꺼내지는 무한 루프 상태가 됐었음.

0개의 댓글