본문 바로가기
코딩테스트/문제풀이 팁

[Kakao] HashMap의 value가HashSet일때 - 신고결과받기

by asdft 2024. 3. 19.

https://school.programmers.co.kr/learn/courses/30/lessons/92334

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

풀이

 

풀이에 필요한 Map 정의 및 초기화

  • key는 유저아이디, value는 key를 신고한 유저의 아이디의 Set을 가진 Map
    • 동일한 유저에 대한 신고횟수는 1회로 처리하기 때문에 중복을 없애기 위해 Set을 Value로 함
  • key는 유저아이디, value는 임의의 인덱스를 가진 Map을 정의

 

        int[] answer = new int[id_list.length];
        HashMap<String,Integer> idxMap = new HashMap<>();	// (1)
        HashMap<String,HashSet<String>> map = new HashMap<>();  //(2)

 

(1) 이름-인덱스로 맵핑하기 위해 정의. 

 

(2) 신고당한사람, 신고한 사람 으로 맵핑하기 위해 정의. 위해서 말했듯,

     동일한 유저에 대한 신고횟수는 1회로 처리하기 때문에 중복을 없애기 위해 HashSet을 Value로 함

 

 

Map 초기화

  for(int i=0;i<id_list.length;i++){
            idxMap.put(id_list[i],i);
            map.put(id_list[i], new HashSet<>());
        }

 

 

 

신고 기록

for(String r : report){
            String[] str = r.split(" ");
            String sender = str[0];		// 신고한 사람
            String receiver = str[1];		// 신고 당한 사람
            map.get(receiver).add(sender);  
        }

 

 

신고한 사람을 sender, 신고 당한 사람을 receiver로 정의.

신고 당한 사람의 value에  누가 신고했는지 Map에 저장

 

신고당한사람 = [신고한 사람]

 

 

 

 

이용 정지 메일 발송

이용이 정지된 유저에 대해 해당 유저를 신고한 Id에 메일이 몇번 전송되는지 파악

map에는 해당 유저를 신고한 Id Set이 저장되어 있음

 

map을 순회하여 Set마다 사이즈가 2이상인지 확인

  • 2이상이라면 Set(해당 유저를 신고한 ID)에게 메일을 발송
  • idxMap에 맞게 끔, 신고한 Id에 대해 누적값을 1씩 증가
   for(int i=0;i<id_list.length;i++){
            HashSet<String> send = map.get(id_list[i]);
            if(send.size() >= k){
                for(String name : send){
                    answer[idxMap.get(name)]++;
                }
            }
        }

 

 

 

 

코드

import java.util.*;
class Solution {
    public int[] solution(String[] id_list, String[] report, int k) {
        int[] answer = new int[id_list.length];
        HashMap<String,Integer> idxMap = new HashMap<>();
        HashMap<String,HashSet<String>> map = new HashMap<>();  //신고받은사람,신고한사람
        
        for(int i=0;i<id_list.length;i++){
            idxMap.put(id_list[i],i);
            map.put(id_list[i], new HashSet<>());
        }
        
        for(String r : report){
            String[] str = r.split(" ");
            String sender = str[0];
            String receiver = str[1];
            map.get(receiver).add(sender);  
        }
        System.out.println(map);
        
        for(int i=0;i<id_list.length;i++){
            HashSet<String> send = map.get(id_list[i]);
            if(send.size() >= k){
                for(String name : send){
                    answer[idxMap.get(name)]++;
                }
            }
        }
        return answer;
    }
}