JAVA

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

Son 2022. 11. 8. 15:47

https://campus.programmers.co.kr/app/courses/15436/curriculum/lessons/132823

 

  • 각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.
    • 신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.
    • 한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.
     

con이 ryan을 4번이나 신고했지만 동일한 유저에 대한 신고 횟수는 1회로 처리되므로 메일이 발송되지 않았다

즉 중복인 되는 경우를 없애주기 위해서 HashMapHashSet 을 사용한다

 

Set : 데이터를 중복 저장할 수 없고, 입력 순서대로의 저장순서를 보장 받을 수 없는 자료구조
HashSet : Set 인터페이스를 구현. 순서가 필요없는 데이터를 hash table 에 저장. Set 중 가장 성능이 좋고, put() 메소드를 사용해 데이터를 넣는다. HashMap 인스턴스를 사용한다.
HashMap : Map 인터페이스를 구현. key-value 형식의 데이터를 저장. 중복된 key 값을 허용하지 않는다. add() 메소드를 사용해 데이터를 넣는다.

reportedMap : [신고된ID, [신고한ID들]] 로 구성된 HashMap
     - key 는 유저ID(신고된ID), value 는 중복 허용을 하지 않는 HashSet 으로 사용
answerMap : [신고된ID, 메일 수] 로 구성된 HashMap
최종적으로 answer 에는  answerMap 의 key 별 value 값의 1차원 배열이 들어간다

 

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;

class Solution {
	public static int[] solution(String[] id_list, String[] report, int k) {
	        int[] answer = {};
	        answer = new int[id_list.length];

		 /*
                 * key 는 유저ID
                 * value 는 신고한 유저ID의 set 을 가진 map
                 * 동일한 유저ID에 대한 신고횟수는 1회로 처리하기 때문에 중복 허용을 하지 않는 set 을 value 로 사용
                 * */

	   		/*Map 형태(key, value)에서 key 값은 String(신고된 아이디) value값은 HashSet 신고한 ID(중복 허용하지 않기위함)*/
		Map<String, HashSet<String>> reportedMap = new HashMap<>(); // [신고된ID, [신고한ID]]
		Map<String, Integer> answerMap = new HashMap<>(); // [신고된Id, 메일 수] 

		
		/* 1. Map 초기화 */
		for (int i = 0; i < id_list.length; i++) {
			HashSet<String> reportingId = new HashSet<>(); // 신고한ID
			reportedMap.put(id_list[i], reportingId); // 유저ID, 신고한ID 초기 세팅
			answerMap.put(id_list[i], 0);  // 메일 수는 모두 0 으로 초기화
		}
		

		
		/*
		 * 2. 신고 기록 세팅 report 는 "신고한ID 신고된ID" 로 구성됨
		 */
		for (String s : report) {
			String[] reportStr = s.split(" ");
			String reportingID = reportStr[0]; // 신고한ID
			String reportedID = reportStr[1]; // 신고된ID
			reportedMap.get(reportedID).add(reportingID); // 신고된ID 를 key 값으로 신고한ID 배열을 value 로 새팅
		}
		
		
		/*
		 * 3. 유저가 받은 이용 정지 결과 메일 세팅
		 */
		for (String reportedUser : reportedMap.keySet()) { // reportedUser 는 신고된ID유저
			HashSet<String> userForSend = reportedMap.get(reportedUser); // reportedUser(신고된유저)를 신고한 유저
			if (userForSend.size() >= k) { // 신고된 횟수가 K번 이상일 경우
				for (String userId : userForSend) {
					answerMap.put(userId, answerMap.get(userId) + 1); // answerMap 에 신고된Id 별 메일 수 넣기
				}
			}
		}
		

		
		/*
		 * 4. 유저ID 별 받은 메일 수를 answer 에 세팅
		 */
		for (int i = 0; i < id_list.length; i++) {
			answer[i] = answerMap.get(id_list[i]);
			System.out.println(answer[i]);
		}

		return answer;
	}

}