신고 결과 받기

문제


문제 풀이

유저가 신고를 한 아이디를 가지고 몇 번 신고를 했는지 체크하는 문제이다. 

 

한 유저가 한 아이디를 여러번 신고하는 문제를 set 자료구조를 사용하여 처리 하였으며, 그렇게 모인 신고리스트를 map 자료구조로 카운팅하였음. 

 

카운팅 된 수가 k가 될 때 ban이 되게 하였고 그 ban이 된 리스트를 가지고 유저가 신고한 사람이 밴을 당하였는지 다시 카운팅하여 결과 배열에 담았다. 


나의 답안

public static int[] solution(String[] id_list, String[] report, int k) {
    int[] answer = new int[id_list.length];
    Map<String, Set<String>> reportMap = new HashMap<>();
    ArrayList<String> banList = new ArrayList<>();
    Map<String, Integer> ban = new HashMap<>();

    for (String id : report) {
        Set<String> set = new HashSet<>();
        String[] s = id.split(" ");
        if (reportMap.containsKey(s[0])) {
            reportMap.get(s[0]).add(s[1]);
        } else {
            set.add(s[1]);
            reportMap.put(s[0], set);
        }
    }

    for (String key : reportMap.keySet()) {
        Set<String> strings = reportMap.get(key);
        Iterator<String> iterator = strings.iterator();
        while (iterator.hasNext()) {
            String s = iterator.next();
            ban.put(s, ban.getOrDefault(s, 0) + 1);

            if (ban.get(s) == k) banList.add(s);
        }
    }

    for (int i = 0; i < id_list.length; i++) {
        int count = 0;
        if (reportMap.containsKey(id_list[i])) {
            Set<String> strings = reportMap.get(id_list[i]);
            Iterator<String> iterator = strings.iterator();
            while (iterator.hasNext()) {
                String s = iterator.next();
                for (String baned : banList) {
                    if (s.equals(baned)) count++;
                }
            }
        }
        answer[i] = count;
    }

    return answer;
}

다른 답안

import java.util.*;
class Solution {
 public int[] solution(String[] id_list, String[] report, int k) {
        // key: 신고당한놈, value: 몇명한테 당했는지
        Map<String, Set<String>> map = new HashMap<>();

        for (String rep : report) {
            String[] arr = rep.split(" ");
            Set<String> set = map.getOrDefault(arr[1], new HashSet<>());
            set.add(arr[0]);
            map.put(arr[1], set);
        }

        // key: 알림받을 놈, value: 몇번 알림받을지
        Map<String, Integer> countMap = new LinkedHashMap<>();

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

        for (Map.Entry<String, Set<String>> entry : map.entrySet()) {
            if (entry.getValue().size() >= k) { // 정지당할놈
                for (String value : entry.getValue()) {
                    countMap.put(value, countMap.getOrDefault(value, 0) + 1);
                }
            }
        }

        return countMap.values().stream().mapToInt(Integer::intValue).toArray();
    }
}

'Programmers 문제풀이 > Lv.1' 카테고리의 다른 글

공원 산책  (0) 2023.03.30
바탕화면 정리  (0) 2023.03.29
개인정보 수집 유효기간  (0) 2023.03.29
대충 만든 자판  (0) 2023.03.28
둘만의 암호  (0) 2023.03.27