순간을 기록으로

[Java] 신고 결과 받기 | 프로그래머스 본문

Problem Solving

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

luminous13 2022. 4. 18. 17:01

문제

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

 

코딩테스트 연습 - 신고 결과 받기

문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의

programmers.co.kr

 

풀이

레벨 1에 있지만 레벨 1이 아닌 거 같은 문제. 접근하는 방법이 어려워서 고민을 많이 했다.

HashSet과 HashMap을 이용해서 풀 수 있는 문제다.

 

 

문제 풀이 순서는 크게 다음과 같다.

  1. HashSet을 이용해서 report에서 중복을 제거하기
    • 문제에서 조건이 있을 경우 초반에 조건을 처리하지 않으면 코딩을 할수록 문제가 어려워질 수 있다.
    • HashSet<String> uniqueReport = new HashSet<>();
  2. HashMap과 ArrayList를 사용해서 신고자 목록 구하기
    • 신고당한 사람이 Key가 되고 신고자 리스트를 value로 가지는 Map을 만든다
    • HashMap<String, ArrayList<String>> reporterListMap = new HashMap<>();
  3. 정지된 사용자를 신고자에게 이메일로 알려주기 위한 이메일 전송 횟수를 담을 Map 만들기
    • 신고자가 Key가 되고 이메일을 받는 횟수를 value로 하는 Map을 만든다
    • HashMap<String, Integer> countEmailMap = new HashMap<>();
  4. 정답 구하기

 

소스코드

package 프로그래머스.레벨2.신고결과받기;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;

public class Solution {
    public int[] solution(String[] id_list, String[] report, int k) {
        int[] answer = new int[id_list.length]; // id_list 길이로 설정

        // 1.중복제거
        HashSet<String> uniqueReport = new HashSet<>();
        for(String str : report) {
            uniqueReport.add(str);
        }

        // 2.신고자 List Map 만들기
        HashMap<String, ArrayList<String>> reporterListMap = new HashMap<>();
        for (String str : uniqueReport) {
            String[] temp = str.split(" ");

            String reporter = temp[0];
            String reportee = temp[1];

            ArrayList<String> reporterList = reporterListMap.getOrDefault(reportee, null);
            if (reporterList == null) reporterList = new ArrayList<>();

            reporterList.add(reporter);
            reporterListMap.put(reportee, reporterList);
        }

        // 3.이메일 받을 횟수를 저장할 Map 만들기
        HashMap<String, Integer> countEmailMap = new HashMap<>();
        for (ArrayList<String> reporterList : reporterListMap.values()) {
            if (reporterList.size() >= k)
                for (String reporter : reporterList)
                    countEmailMap.put(reporter, countEmailMap.getOrDefault(reporter,0)+1);
        }

        // 4.numOfEmailMap을 사용해서 정답 구하기
        for (int i=0; i< id_list.length; i++) {
            answer[i] = countEmailMap.getOrDefault(id_list[i], 0);
        }
        return answer;
    }

    public static void main(String[] args) {
        Solution sol = new Solution();
        String[] id_list = {"muzi", "frodo", "apeach", "neo"};
        String[] report = {"muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"};
        int k = 2;
//        String[] id_list = {"con", "ryan"};
//        String[] report = {"ryan con", "ryan con", "ryan con", "ryan con"};
//        int k = 3;

        sol.solution(id_list, report, k);
    }
}

Reference

https://www.youtube.com/watch?v=ncCUNOJUn9Q 

 

Comments