Algorithms

[프로그래머스] KAKAO RECRUITMENT 2022 신고결과받기

유자맛바나나 2022. 3. 4. 17:55

문제

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

 

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

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

programmers.co.kr

 

접근

제한시간은 [정확성 테스트: 10초]만 존재하므로 불필요한 반복만 줄이면 된다. 

네 개의 Hash 자료구조를 사용했다. 

1. abuseCntMap: 아이디 별 신고 당한 횟수 Map

2. abuseAndReportIdMap: 각 신고당한 사람이 어떤 사람(아이디)에게 신고 당했는지 기록

3. reportAndAbuseIdMap: 신고한 사람이 어떤 사람(아이디)를 신고했는지 기록

4. scoreCntMap: 신고한 사람이 받은 결과 메일 수

*report: 신고한 사람 / abuse: 신고당한 사람

 

input으로 받은 report 배열을 순회하며 1,2,3 자료구조를 채운 뒤,

abuseCntMap을 순회하며 신고당한 횟수가 k 이상인 id에 대해,

abuseAndReportIdMap에서 신고한 사람들의 id를 가져온 후,

scoreCntMap에 메일 받은 수를 더해준다.

 

Code

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

class Solution {

    public int[] solution(String[] id_list, String[] report, int k) {
        int[] answer = new int[id_list.length];

        Map<String, Integer> abuseCntMap = new ConcurrentHashMap<>();
        Map<String, List<String>> abuseAndReportIdMap = new ConcurrentHashMap<>();
        Map<String, Map<String, Boolean>> reportAndAbuseIdMap = new ConcurrentHashMap<>();
        Map<String, Integer> scoreCntMap = new ConcurrentHashMap<>();

        for (String record : report) {
            String reportId = record.split(" ")[0];
            String abuseId = record.split(" ")[1];

            if (!reportAndAbuseIdMap.containsKey(reportId)) {
                reportAndAbuseIdMap.put(reportId, new ConcurrentHashMap<>());
            }

            if (!reportAndAbuseIdMap.get(reportId).containsKey(abuseId)) {
                reportAndAbuseIdMap.get(reportId).put(abuseId, true);
                if (!abuseCntMap.containsKey(abuseId)) {
                    abuseCntMap.put(abuseId, 1);
                } else {
                    abuseCntMap.put(abuseId, abuseCntMap.get(abuseId) + 1);
                }

                if (!abuseAndReportIdMap.containsKey(abuseId)) {
                    List<String> reportIds = new ArrayList<>();
                    reportIds.add(reportId);
                    abuseAndReportIdMap.put(abuseId, reportIds);
                } else {
                    abuseAndReportIdMap.get(abuseId).add(reportId);
                }
            }
        }

        abuseCntMap.keySet().forEach(abuseId -> {
            if (abuseCntMap.get(abuseId) >= k) {
                abuseAndReportIdMap.get(abuseId).forEach(reportId -> {
                    if (!scoreCntMap.containsKey(reportId)) {
                        scoreCntMap.put(reportId, 1);
                    } else {
                        scoreCntMap.put(reportId, scoreCntMap.get(reportId) + 1);
                    }
                });
            }
        });

        for (int i = 0; i < id_list.length; i++) {
            answer[i] = scoreCntMap.getOrDefault(id_list[i], 0);
        }

        return answer;
    }
}

 

 

 

'Algorithms' 카테고리의 다른 글

[Algorithms] BFS 코드 구조  (0) 2022.06.12
[Codility] PermMissingElem  (0) 2022.02.28
[Codility] OddOccurrencesInArray  (0) 2022.02.26
[Codility] CyclicRotation  (0) 2022.02.24
[Codility] BinaryGap  (0) 2022.02.22