프로그래머스 | 신고 결과 받기 (Java)

mul·2023년 2월 21일
0

코딩테스트연습

목록 보기
26/56

🔒 문제

프로그래머스 Lv.1 2022 KAKAO BLIND RECRUITMENT 신고 결과 받기

🔑 해결

이용자의 ID가 담긴 문자열 배열 id_list, 각 이용자가 신고한 이용자의 ID 정보가 담긴 문자열 배열 report, 정지 기준이 되는 신고 횟수 k가 매개변수로 주어질 때, 각 유저별로 처리 결과 메일을 받은 횟수를 배열에 담아 return하는 solution 함수를 작성하는 문제이다.

정지 기준을 넘은 회원이 생겼을 때, 처리 결과 메일을 받을 유저를 저장하는 것에서 고민했다. 한 유저를 여러 번 신고할 수는 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리되기 때문에 중복이 불가하도록 저장되어야 했다. 그래서 set을 사용해야 한다고 생각했다. 이를 정지당한 유저의 아이디와 매칭시키기 위해 Map을 사용하였다.

  1. 각 아이디를 key 값으로 가지고 key 값의 아이디를 신고한 유저들을 set에 저장할 map을 생성.
  2. id_list에 저장된 아이디들을 key 값으로, 신고한 아이디들을 저장할 set을 생성 후에 value 값으로 초기화.
  3. report에 저장된 값을 공백문자로 분리하여 RIDs[0]은 신고자, RIDs[1]은 피신고자이므로, map에 RIDs[1]으로 저장된 key를 찾아서(get) 해당 set에 신고자의 아이디(RIDs[0])를 add한다.
  4. 신고 횟수가 k번 이상이면(set.size() >= k), id_list에 대해 for문을 돌려 set에 저장된 값에 id_list[j]가 포함되어 있으면(contains(id_list[j])) 처리 결과 메일을 받을 횟수 answer[j]++

🔓 코드

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
class Solution {
    public int[] solution(String[] id_list, String[] report, int k) {
        int[] answer = new int[id_list.length];
        
        Map<String, HashSet<String>> map = new HashMap<>(); // 신고당한 아이디, 신고한 아이디들
        for (int i = 0; i < id_list.length; i++) {
        	HashSet<String> set = new HashSet<String>();
        	map.put(id_list[i], set);
        }
        
        for (int i = 0; i < report.length; i++) {
			String[] RIDs = report[i].split(" ");
			map.get(RIDs[1]).add(RIDs[0]);
		}
        
        for (int i = 0; i < id_list.length; i++) {
			if (map.get(id_list[i]).size() >= k) { // 해당 아이디를 신고한 id가 k개 이상이면 정지
				for (int j = 0; j < id_list.length; j++) {
					if (map.get(id_list[i]).contains(id_list[j])) {
						answer[j]++;
					}
				}
			}
		}
        
        return answer;
    }
}

0개의 댓글