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

hoonssac·2025년 5월 29일

Coding test

목록 보기
4/9
post-thumbnail

문제 링크

✅ 문제 파악

  • id_list: 이용자 ID 목록
  • report: "신고자 피신고자" 문자열 배열 (중복 신고 가능)
  • k: 정지 기준 (동일 이용자가 k번 이상 신고당하면 정지)
  • 각 이용자는 한 번에 한 명만 신고할 수 있으며, 동일한 사람을 여러 번 신고해도 1번으로 처리됨
  • k번 이상 신고당한 이용자는 정지된다.
  • 각 이용자는 자신이 신고한 사람이 정지될 경우 정지 알림 메일을 받는다.
  • 결과로는 id_list 순서대로 각 이용자가 받은 메일의 수를 배열로 반환해야 한다.

⚒️ 접근 방법

  1. 중복 신고 제거

    HashSet<String> reportSet = new HashSet<>(Arrays.asList(report));
    • report[]에는 같은 사람이 같은 사람을 여러 번 신고할 수 있음.
    • HashSet을 이용해 중복을 제거.
  2. 각 아이디가 신고당한 횟수 집계

    HashMap<String, Integer> reports = new HashMap<>();
    for (String id : id_list) {
        reports.put(id, 0);
    }
    for (String r : reportSet) {
        String[] tmp = r.split(" ");
        reports.put(tmp[1], reports.get(tmp[1]) + 1);
    }
    • 초기화 : 모든 유저와 신고당한 횟수를 0으로 시작
    • 이후, 신고 내용을 분석하면서 피신고자(tmp[1])의 신고 횟수를 누적
  3. 정지된 사람을 신고한 사람에게 메일 횟수 증가

    for (String r : reportSet) {
        String[] tmp = r.split(" ");
        if (reports.get(tmp[1]) >= k) {
            for (int i = 0; i < id_list.length; i++) {
                if (id_list[i].equals(tmp[0])) {
                    answer[i]++;
                    break;
                }
            }
        }
    }
    • 정지 기준(k)을 만족한 피신고자에 대해, 해당 사람을 신고한 신고자(tmp[0])의 메일 횟수를 1 증가.
  4. 메일 개수 배열 반환

    return answer;
    • 메일을 받은 횟수를 id_list 순서대로 정리한 answer[] 배열을 반환.

✨ 전체 코드

import java.util.*;

class Solution {
    public int[] solution(String[] id_list, String[] report, int k) {
        int[] answer = new int[id_list.length];
        // 중복되는 신고 없애기
        HashSet<String> reportSet = new HashSet<>(Arrays.asList(report));
        
        // 아이디마다 신고 당한 횟수 저장
        HashMap<String, Integer> reports = new HashMap<>();
        for (String id : id_list) {
            reports.put(id, 0);
        }
        for (String r : reportSet) {
            String[] tmp = r.split(" ");
            reports.put(tmp[1], reports.get(tmp[1]) + 1);
        }
        
        // 해시셋을 순회하며 신고대상의 신고당한 횟수가 k를 넘어서는 경우를 찾는다.
        for (String r : reportSet) {
            String[] tmp = r.split(" ");
            if (reports.get(tmp[1]) >= k) {
                for (int i = 0; i < id_list.length; i++) {
                    if (id_list[i].equals(tmp[0])) {
                        // 신고자의 메일 받는 횟수를 1 증가시킨다.
                        answer[i]++;
                        break;
                    }
                }
            }
        }

        return answer;
    }
}
profile
훈싹의 개발여행

0개의 댓글