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

popolarburr·2023년 3월 14일
0
post-thumbnail

- 문제


너무 길어서 링크로 대체합니다. 문제링크


- 풀이



import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;

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

        LinkedHashMap<String, Integer> report_map = new LinkedHashMap<>();
        LinkedHashMap<String, List<String>> report_list = new LinkedHashMap<>();

        for (String str : id_list) {
            report_map.put(str, 0);
            report_list.put(str, new ArrayList<>());
        }

        for (String str : report) {
            String reporter = str.split(" ")[0];
            String reported = str.split(" ")[1];

            if (!report_list.get(reporter).contains(reported)) {
                report_list.get(reporter).add(reported);
                report_map.put(reported, report_map.getOrDefault(reported, 0) + 1);
            }
        }

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

        int count = 0;
        for (String str : id_list) {
            List<String> tmp = report_list.get(str);

            for (String s : tmp) {
                if (report_map.get(s) >= k) {
                    answer[count]++;
                }
            }
            count++;
        }

        return answer;
    }
}

- 정리

저는 일단 어떻게 풀지 고민했는데, 문제를 쭉 일어보니 생각나는건 링크드해쉬맵
밖에 없었어요.

그리고 두개를 사용해야겠다 생각했어요.

링크드해쉬맵을 사용해야 id_list대로 정답배열을 꾸리기 편할 것 같았고,
그래야 순서를 유지할 수 있어서 링크드해쉬맵을 사용했습니다.

여기는
하나는 이름별 신고당한횟수 report_map이고
하나는 이름별 신고한 사람들 목록인 report_list입니다

그렇게 초기 map을 생성합니다.

그리고 각자 신고한 리스트를 만들고, 신고당한 횟수를 카운팉ㅇ합니다.

여기 if문이 뭐냐면

내가 신고한 목록에 신고할 사람이 없을때만 신고한 리스트에 더하고
신고횟수를 +1 해주는겁니다.

일단 왜 이렇게 했냐면 동일한 유저에 대한 신고는 1회로 처리하기 때문에
신고한 목록에 없을때만 신고리스트에 넣고 신고횟수를 늘리려했습니다.

그렇게 각자 신고한 리스트와 신고횟수가 만들어졌으면

정답배열을 생성하는데, 정답배열은 id_list순서대로 해야하기 때문에
id_list 길이로 생성합니다.

그렇게 이중for문을 사용하는데, 어차피 정답배열도 id_list대로 하기 떄문에
id_list에 있는 값을 활용해서 큰 포문을 돕니다.

그때 신고한 목록을 확인하기 위해서 list로 받고, 이 list에서 각각의 이름을 뺴옵니다.

결과적으로 정답배열에는 내가 신고한 사람들 중 정지먹은 사람들의 횟수이기때문에
내가 신고한 리스트의 각각의 이름들의 신고횟수를 확인합니다.
그게 내부for문이구요.
그래서 tmp로 신고한 리스트를 받고, 각각의 이름이 신고횟수가 k번 이상일 때
해당 정답배열 인덱스에 ++을 해줬습니다.

마지막으로 정답배열을 리턴하면 끝이빈다.


내가 스터디때 이야기하려고 미리 작성해놓은 글을 퍼왔다.
이 문제는 처음에 어려울 것 같았지만 생각보다 재밌었고 한번에 풀려서 너무 좋았지만 리팩토링이 필수로 여겨진다.


[링크] : 개인저장소

profile
차곡차곡

0개의 댓글