알고리즘/구현

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

제이G 2022. 6. 21. 21:29

 


 

핵심정리

1. hashMap<String, hashset<String>> 자료구조 사용 (목표를 구하는데 용이하기 때문)

그 것을 map이라고 하자.

 

2. map을 "reporter(신고자)"  , "reported(피신고자)" 순서가 아닌, "reported(피신고자)"  , "reporter(신고자)" 순서로 정의

처음과 같은 형태로 정의하면 각 reported가 k번이상 신고받았는지 테이블을 순회하며 확인해야함. 두번째순서로 정의하면 단순히, reporter의 숫자만 count하면 된다.

 

3. hashMap<String, Integer> 자료구조 사용

각 ID별 idx를 지정해줘야 함

예를들어 k=2일때, reported A에 대한 reporter [B, C]를 조사중이라고 해보자. reporter의 수가 2이상이기 때문에 각 B, C의 신고처리 받는메일 횟수를 1씩 증가시켜줘야 한다. 하지만, B, C는 String이기 때문에 어느 인덱스를 증가시켜줘야하는지 알 수 없다.

 


코드

 

import java.util.*;
class Solution {
    public int[] solution(String[] id_list, String[] report, int k) {
        HashMap<String, HashSet<String>> map = new HashMap<>();
        HashMap<String, Integer> idIdx = new HashMap<>();
        int[] answer = new int[id_list.length];
        for (int i=0; i<id_list.length; i++) {
            map.put(id_list[i], new HashSet<>());
            idIdx.put(id_list[i], i);
        }
        
        for (int i=0; i<report.length; i++) {
            String[] tmp = report[i].split(" ");
            String reporter = tmp[0];
            String reported = tmp[1];
            map.get(reported).add(reporter);
        }

        
        for (int i=0; i<map.size(); i++) {
            HashSet<String> reporters = map.get(id_list[i]);
            if (reporters.size() >= k) {
                for (String reporter: reporters) {
                    answer[idIdx.get(reporter)]++;
                }
            }
        }
        return answer;
    }
}