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

송규빈·2022년 5월 6일
0

📘 문제

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

💡 풀이

☑ 신고를 몇 번 당했는지에 따라 메일 발송 여부가 정해지므로 신고당한 ID를 키 값으로 잡아야한다.

1. 신고당한 ID를 키로하여 신고한 ID 리스트와 신고당한 횟수를 저장하는 HashMap을 생성

2. 신고 결과 메일을 받은 개수를 저장하는 HashMap 생성

3. "각 유저는 한 번에 한 명의 유저를 신고할 수 있다"는 뜻은 신고당한 ID에 중복된 신고한 ID가 있으면 안 되므로 value를 중복이 제거되는 Set 자료구조를 사용

💻 코드

import java.util.*;

class Solution {

	// 신고한 ID 리스트 저장
    HashMap<String, LinkedHashSet<String>> listHash = new HashMap();
    // 신고당한 횟수 저장
    HashMap<String, Integer> reportCountHash = new HashMap();
    // 신고 결과 메일을 받은 횟수 저장
    HashMap<String, Integer> mailCountHash = new HashMap();

    public int[] solution(String[] id_list, String[] report, int k) {
        int[] answer = new int[id_list.length];
        // 각 유저는 한 번에 한 명의 유저를 신고할 수 있다
        // 신고 횟수에 제한은 없고, 서로 다른 유저를 계속해서 신고 가능
        // 동일 유저 신고는 1회로 처리
        // k번 이상 신고된 유저: 게시판 이용 정지, 신고한 모든 유저에게 이메일 발송
        // 마지막에 한꺼번에 정지 메일 발송

		
        // 각 신고당한 유저별로 신고한 ID 리스트 저장
        for (int i = 0; i < report.length; i++) {
            String[] tmp = report[i].split(" ");
            String userId = tmp[0];
            String reportedUserId = tmp[1];
            listHash.computeIfAbsent(reportedUserId, v -> new LinkedHashSet()).add(userId);

            LinkedHashSet<String> reportUserList = listHash.get(reportedUserId);

        }
        // 신고당한 횟수 저장
        // 각 유저당 한번에 한명의 유저를 신고할 수 있으므로
        // 중복 제거된 신고한 유저의 ID 개수 = 신고당한 횟수
        listHash.forEach((reportedId, list) -> {
            reportCountHash.put(reportedId, list.size());
        });
        
        // k번 이상 신고를 당했을 시 
        // 신고한 유저들에게 메일 발송
        reportCountHash.forEach((id, count) -> {
                    if (count >= k) {

                        setMailCountHash(id);
                    }
                }
        );

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

        return answer;
    }

    public void setMailCountHash(String id) {
        LinkedHashSet<String> tmpReportUserList = listHash.get(id);
        tmpReportUserList.forEach(reportId -> mailCountHash.put(reportId, mailCountHash.getOrDefault(reportId, 0) + 1));
    }

}
profile
🚀 상상을 좋아하는 개발자

0개의 댓글