프로그래머스

[프로그래머스] 프로그래머스 Level1 신고 결과 받기 Java (카카오 코딩테스트)

Doshisha 2022. 5. 25. 14:39

문제

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

 

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

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

programmers.co.kr

풀이

Hash로 해결할 수 있었다.

신고 정보를 관리할 reportMap과 신고 메일을 받은 횟수를 관리할 infoMap, 마지막 리턴해줄 때 순서대로 리턴해주기 위한 idxMap을 만들고 reportMap에서는 신고 정보를 바탕으로 모든 원소에 대해 Key : 신고 당한 사람, Value : 신고한 사람들으로 관리해주었다. 이때 Value에는 Set을 사용해주었는데 중복 신고가 되지 않는 점을 생각하여 HashSet을 이용해 중복 신고를 걸러줄 수 있도록 하였다.

신고 정보를 공백 단위 split으로 잘라주면 신고한 사람과 신고 당한 사람의 정보를 얻을 수 있고, 그 정보를 바탕으로 reportMap을 채워주면 된다.

reportMap을 채운 이후에는 k번 이상의 신고를 받은 사람들을 찾아내고, 그 사람들을 신고한 사람에 대해 for문을 돌며 infoMap에 Key : 유저 이름, Value : 메일을 받은 횟수로 테이블을 채워주었다. 이러면 메일 받은 횟수와 그 사람의 이름을 찾아냈으니 처음에 만든 idxMap을 이용해서 원래 순서에 맞게 리턴할 수 있도록 answer에 대입해주면 문제를 해결할 수 있다.

코드

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

class Solution {
    public int[] solution(String[] id_list, String[] report, int k) {

        int[] answer = new int[id_list.length];

        HashMap<String, HashSet<String>> reportMap = new HashMap<>();
        HashMap<String, Integer> infoMap = new HashMap<>();
        HashMap<Integer, String> idxMap = new HashMap<>();

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

        for (String element : report) {
            String[] action = element.split(" ");
            reportMap.get(action[1]).add(action[0]);
        }

        for (String user : id_list) {
            if(reportMap.get(user).size() >= k) {
                for (String name : reportMap.get(user)) {
                    infoMap.put(name, infoMap.get(name) + 1);
                }
            }
        }

        for(int i = 0; i < id_list.length; i++) {
            String targetName = idxMap.get(i);
            answer[i] = infoMap.get(targetName);
        }

        return answer;
    }
}