본문 바로가기

프로그래머스(Java)/Level 1

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

728x90

코드 힌트

저는 Set을 사용하지 않고 boolean[][] 을 사용하여 중복을 제거했습니다. 만약 Set으로 제거하는 것을 원하시는 분은 다른 글을 참고하시는 것을 추천합니다.

  1. ID와 인덱스 매핑하기(HashMap<String,Integer> <이름, index>)
    • 사용자 ID 목록을 기반으로, 각 사용자의 ID와 해당 인덱스를 연결합니다. 이렇게 하면 신고 내역을 처리할 때, 사용자 이름 대신 인덱스를 사용해 작업할 수 있어 효율적입니다.
  2. 중복 신고 방지(boolean[][]  : [신고한 사람 index][신고당한 사람 index])
    • 신고 내역을 처리할 때, 동일한 사용자가 같은 사람을 여러 번 신고하는 경우, 중복 신고를 피하기 위해 신고가 이미 처리된 적이 있는지 확인합니다.
    • 중복 신고를 방지하는 배열을 사용하여, 만약 이전에 신고된 적이 없다면 신고 횟수를 증가시킵니다.
  3. 신고 횟수 세기(int[] 사용 매핑된 인덱스로 주소 추적)
    • 각 사용자가 받은 신고 횟수를 기록합니다. 사용자가 신고된 횟수가 특정 기준(예: k회) 이상일 때, 그 사용자를 신고한 사람들에게 알림을 보내야 합니다.
  4. 결과 계산
    • 각 사용자가 신고한 다른 사용자들의 신고 횟수를 확인합니다. 만약 신고된 사용자의 신고 횟수가 기준 이상이라면, 그 사용자를 신고한 사람에게 알림을 보낼 수 있는 횟수를 기록합니다.

 

 


정답은 더보기 클릭

더보기
import java.util.*;

class Solution {
    public int[] solution(String[] id_list, String[] report, int k) {
        // id_list 배열의 길이를 n으로 정의 (사용자 수)
        int n = id_list.length;
        
        // 최종 결과를 저장할 배열, 모든 요소를 0으로 초기화
        int[] result = new int[n];
        // 사용자가 신고한 내역을 기록할 2차원 boolean 배열
        boolean[][] hasReported = new boolean[n][n];
        // 각 사용자가 받은 신고 횟수를 기록할 배열
        int[] reportCounts = new int[n];
        
        // 사용자 ID를 인덱스와 매핑하기 위해 HashMap 사용
        HashMap<String, Integer> userIndexMap = new HashMap<>();
        
        // id_list 배열을 순회하여 각 사용자 ID에 대해 인덱스를 매핑
        for (int i = 0; i < n; i++) {
            userIndexMap.put(id_list[i], i);
        }
        
        // report 배열을 순회하여 신고 내역을 처리
        for (int i = 0; i < report.length; i++) {
            // 신고 내용을 공백으로 분리하여 신고자와 피신고자 추출
            String[] reportDetails = report[i].split(" ");
            
            int reporterIndex = userIndexMap.get(reportDetails[0]);
            int reportedIndex = userIndexMap.get(reportDetails[1]);
            
            // 동일한 신고는 한 번만 처리되도록 중복 신고 방지
            if (!hasReported[reporterIndex][reportedIndex]) {
                reportCounts[reportedIndex] += 1;
                hasReported[reporterIndex][reportedIndex] = true;
            }
        }
        
        // 각 사용자가 신고한 피신고자의 신고 횟수가 k 이상인 경우 결과 카운트 증가
        for (int i = 0; i < n; i++) {
            int validReportCount = 0;
            for (int j = 0; j < n; j++) {
                if (hasReported[i][j] && reportCounts[j] >= k) {
                    validReportCount++;
                }
            }
            result[i] = validReportCount;
        }
        
        return result;
    }
}
728x90