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

문제 출처 

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

 

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

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

programmers.co.kr

2022 KAKAO BLIND RECRUITMENT 문제고 프로그래머스에서는 level 1문제이다.

 

내가 생각한 접근 방법

-신고 당한 id들의 신고 당한 횟수를 카운트해야 한다.

-정지 당한 id를 신고한 id들을 저장해야한다.

 

가장 시간이 오래 걸렸던게 report의 중복처리였다. String을 어떻게든 카운트해서 중복을 없애는 시도를 하다가 결국 검색을 하게 됐고 간단한 방법을 찾게됐다.

공부한 글 링크:

https://lastday9.tistory.com/90

 

[자바/Java] 배열에서 중복 제거하기 / list에서 중복 제거하기

배열은 중복의 값이 들어갈 수 있다. Java에서 중복 값이 안되는 것은 set, HashMap정도가 생각이 나는데 이미 배열로 주어진 값이 있을 때 중복을 제거하는 방법에 대해서 알아봤다. 1.stream, distinct()

lastday9.tistory.com

 

내가 제출한 코드는 아래와 같은데 여러모로 비효율적이라 고쳐야할 점들이 많이 보인다.

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

class Solution {
    public int[] solution(String[] id_list, String[] report, int k) {
        report = Arrays.stream(report).distinct().toArray(String[]::new);
        HashMap<String, Integer> count = new HashMap<>();
        HashMap<String, ArrayList<String>> idMap = new HashMap<>();
        
        for(String s : report){
            String[] r = s.split(" ");
            if(count.containsKey(r[1])){
                count.put(r[1], count.get(r[1]) + 1);
            }
            else{
                count.put(r[1], 1);
            }
            ArrayList<String> tmp = new ArrayList<>();
            if(idMap.containsKey(r[1])){
                tmp = idMap.get(r[1]);
                tmp.add(r[0]);
                idMap.put(r[1], tmp);
            }
            else{
                tmp.add(r[0]);
                idMap.put(r[1], tmp);
            }
        }
        
        HashMap<String, Integer> mailMap = new HashMap<String, Integer>();
        
        for(Map.Entry<String, Integer> c : count.entrySet()){
            if(c.getValue() >= k){
                for(String s : idMap.get(c.getKey())){
                    if(mailMap.containsKey(s)){
                        mailMap.put(s, mailMap.get(s) + 1);
                    }
                    else{
                        mailMap.put(s, 1);
                    }
                }
            }
        }
        
        int[] answer = new int[id_list.length];
        for(int i = 0; i < id_list.length; i++){
            if(mailMap.containsKey(id_list[i])){
                answer[i] = mailMap.get(id_list[i]);
            }
            else{
                answer[i] = 0;
            }
        }
        return answer;
    }
}

 

-count 해쉬맵에는 <신고당한id, 신고당한횟수>가 들어가게 된다.

-idMap 해쉬맵에는 <신고당한id, 신고한사람id>가 들어가게 된다.

for문 안에서 report를 위의 해쉬맵에 저장한다.

 

-mailMap 해쉬맵에는 <id, 메일을 받을 횟수>가 들어가게된다.

*고치고 싶은 부분 중 하나 메일 받을 횟수를 굳이 해쉬맵을 이용해서 만들게 된 이유는 이전 count와 idMap이 무작위로 순서가 나오기 때문에 바로 answer배열에 집어넣을 수 없어 이런 수고로움을 거쳤는데 더 좋은 방법이 있을 것 같다.

 

-answer 부분 id_list를 이용해서 반복문을 돌려 mailMap에서 id를 순서대로 찾아 정지 메일을 받을 개수를 answer에 저장한다.

 

myoskin