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

바그다드·2023년 9월 18일
0

문제

풀이

import java.util.*;

public class Pro_신고결과받기 {
    public int[] solution(String[] id_list, String[] report, int k) {

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

        // 각 아이디의 위치
        Map<String, Integer> map = new HashMap<>();
        // 신고당한 사람과 신고자 명단 저장
        Map<String, Set> reports = new HashMap<>();
        for(int i = 0; i < id_list.length; i++){
            map.put(id_list[i], i);
            reports.put(id_list[i], new HashSet<String>());
        }

		// report의 신고 기록을 set에 담아 중복 제거
        for(int i = 0; i < report.length; i++){
            String by = report[i].split(" ")[0];
            String to = report[i].split(" ")[1];
            Set<String> list = reports.get(to);
            list.add(by);
        }

		// id_list를 돌머
        for(int i = 0; i < id_list.length; i++){
            Set<String> list = reports.get(id_list[i]);
            // 각 set의 길이가 k 이상일 때만
            if(list.size() >= k){
            	// 신고를 한 사람의 배열 위치에 +1을 해줌
                Iterator<String> iter = list.iterator();
                while(iter.hasNext()){
                    int pos = map.get(iter.next());
                    answer[pos]++;
                }
            }
        }


        return answer;
    }
}

리뷰

  1. 일단 각 id 개수만큼의 신고 기록을 저장할 int형 배열을 선언한다.

  2. id_list를 한번씩 돌면서 2개의 맵을 선언한다.
    하나는 id와 배열 위치를 저장하고,
    하나는 id와 신고자의 명단을 저장할 set을 저장한다.

    • 한명의 신고자가 다른 한 사람을 여러 번 신고했다고 하더라도 단 한번만 신고한 것으로 여기기 때문에 중복을 제거하기 위해 set을 이용했다.
  3. 이번에는 report를 한번 돌며 각 id에 매칭되는 set에 신고자의 이름을 담아준다.

    • 이 과정에서 set에는 중복 신고자를 제거한 신고자 명단이 저장된다.
  4. 마지막으로 id_list를 돌며 각 id가 신고당한 횟수가 k 이상일 때
    set에 저장된 신고자 이름과 매칭되는 배열의 위치에 +1을 해준다.

  5. 배열을 리턴한다.

profile
꾸준히 하자!

0개의 댓글