🙈

⃝ 동글동글 ⃝

🪐ᐩ˖ 🍎

CodingTest/Programmers

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

JONG_UK 2022. 12. 21. 21:27
728x90
반응형
SMALL

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

프로그래머스

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

programmers.co.kr


💬 문제 접근

  • 중복을 제거하기 위해 HashSet과 HashMap을 사용한다.
  • 2명 이상 User를 신고하면 계정이 정지가 되고, 신고한 User에게 메일을 보낸다.
  • 따라서 HashMap에 신고당한 User와 신고한 User의 정보가 담겨야 한다.
  • 신고한 User는 여러명이 될 수 있기 때문에 신고한 User가 중복이 되지 않도록 HashMap 안에 HashSet을 포함해 준다.

💡 문제 풀이

// user의 순서 저장
HashMap<String, Integer> user_id = new HashMap<>();
// 각 user별로 자신을 신고한 user의 set 저장
HashMap<String, HashSet<String>> user_report = new HashMap<>();
// HashMap 초기화
for(int i = 0; i< id_list.length; i++) {
    user_id.put(id_list[i], i); // 입력되는 user_id 순서대로 index 지정
    user_report.put(id_list[i], new HashSet<>()); // user_id별로 HashSet 생성
}
  • 출력문은 answer [ ] 형태이므로, 인자로 전달받은 id_list의 user_id 값을 String 형태로 저장하고, Integer 값으로 i 값을 통해 answer[ ]에 순서대로 담아줄 index 설정을 해준다.
  • 'user_report' HashMap은 각 user의 id를 저장하고, 초기화를 통해 신고한 user_id가 담길 HashSet을 생성해 준다.

 

// user 자신을 신고한 user의 이름 저장
for(String s : report) {
    String[] sarr = s.split(" ");
    user_report.get(sarr[1]).add(sarr[0]);
}
// String[] report = {"muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"};
  • 인자로 전달받은 report 배열의 String 문자열을 분리하여 user_report HashMap에 넣어준다.
  • 신고를 당한 user에게 신고를 한 user의 id를 넣어주는 것이기 때문에 헷갈리니 주의가 필요하다.

 

// user별로 신고당한 횟수가 k 보다 많으면 메일 보내기
for(int i = 0; i<id_list.length; i++) {
    // 자신을 신고한 user set 가져오기
    HashSet<String> hashSet = user_report.get(id_list[i]);
    System.out.println("신고한 user : " + hashSet + " -> 신고당한 user : " + id_list[i]);
    // 신고한 user가 k 이상이면
    if(hashSet.size() >= k) {
        for(String s : hashSet) {
            // user_id 별로 초기화를 통해 index를 설정해 주었기 때문에
            // answer[]의 user index 순서에 맞게 값 증가
            answer[user_id.get(s)]++;
        }
    }
}

  • id_list [0] 번째 일 때 : muzi  ->  muzi를 신고한 유저는 apeach
  • id_list [1] 번째 일 때 : frodo  ->  frodo를 신고한 유저는 muzi, apeach
  • id_list [2] 번째 일 때 : apeach  ->  apeach를 신고한 유저는 없음
  • id_list [3] 번째 일 때 : neo  ->  neo를 신고한 유저는 muzi, frodo

 

  • hashSet에는 신고한 user의 id가 담겨있기 때문에 hashSet의 size()가 k보다 같거나 크다면 계정이 정지되고 hashSet에 담겨있는 user들에게 메일이 전송된다.
  • muzi, apeach, frodo, neo에게는 위에서 초기화를 통해 설정한 value 값이 있기 때문에 user_id.get(s)를 수행하면 id_list와 동일한 배열 index 순서대로 user_id 값을 얻게 되고, 조건문에 만족하는 것만 값이 증가된다.

⭐️ 코드

import java.util.*;

public class Pro_CT_67 {
    // 신고 결과 받기
        public int[] solution(String[] id_list, String[] report, int k) {
            int[] answer = new int[id_list.length];

            // user의 순서 저장
            HashMap<String, Integer> user_id = new HashMap<>();
            // 각 user별로 자신을 신고한 user의 set 저장
            HashMap<String, HashSet<String>> user_report = new HashMap<>();

            // HashMap 초기화
            for(int i = 0; i< id_list.length; i++) {
                user_id.put(id_list[i], i); // 입력되는 user_id 순서대로 index 지정
                user_report.put(id_list[i], new HashSet<>()); // user_id별로 HashSet 생성
            }

            System.out.println("###  HashMap 초기화  ###");
            System.out.println("###### user_id ######");
            user_id.forEach((key, value) -> {
                System.out.println(key + " : " + value);
            });
            System.out.println("###### user_report ######");
            user_report.forEach((key, value) -> {
                System.out.println(key + " : " + value);
            });

            // user 자신을 신고한 user의 이름 저장
            for(String s : report) {
                String[] sarr = s.split(" ");
                user_report.get(sarr[1]).add(sarr[0]);
            }

            System.out.println("###### 입력 후 user_report ######");
            System.out.println("# 신고당한 user : 신고한 user #");
            user_report.forEach((key, value) -> {
                System.out.println(key + " : " + value);
            });

            System.out.println("#######  신고한 user가 신고당한 user 출력  #######");
            // user별로 신고당한 횟수가 k 보다 많으면 메일 보내기
            for(int i = 0; i<id_list.length; i++) {
                // 자신을 신고한 user set 가져오기
                HashSet<String> hashSet = user_report.get(id_list[i]);
                System.out.println("신고한 user : " + hashSet + " -> 신고당한 user : " + id_list[i]);
                // 신고한 user가 k 이상이면
                if(hashSet.size() >= k) {
                    for(String s : hashSet) {
                        // user_id 별로 초기화를 통해 index를 설정해 주었기 때문에
                        // answer[]의 user index 순서에 맞게 값 증가
                        answer[user_id.get(s)]++;
                    }
                }
            }

            return answer;
        }

        public static void main(String[] args) {
            Pro_CT_67 sol = new Pro_CT_67();
            // 전체 유저 목록
            String[] id_list = {"muzi", "frodo", "apeach", "neo"};
            // 유저 ID / 유저가 신고한 ID
            String[] report = {"muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"};
//            String[] report = {"ryan con", "ryan con", "ryan con", "ryan con"};
            int k = 2; // k 번 이상 신고된 유저는 게시판 이용 정지

            // 각 유저별로 결과 처리 메일을 받은 횟수를 배열에 담아 return
            // 신고당한 유저가 정지되면 신고를 한 유저에게 메일 보냄
            System.out.println(sol.solution(id_list, report, k));
        }
}

👀 후기

  • 솔직히 너무 어렵다
  • HashMap 안에 HashSet을 쓸 수 있다는 것을 처음 알았다. 충격 먹었다.
  • Python의 Dictionary안에 배열을 담는 것과 비슷하다고 생각도 들었다.
  • 열심히 공부하자...!🔥
728x90
반응형
LIST