Welcome! Everything is fine.

[프로그래머스/Lv.1] 신고 결과 받기(2022 KAKAO BLIND RECRUITMENT) - Java 본문

프로그래머스/Lv.1

[프로그래머스/Lv.1] 신고 결과 받기(2022 KAKAO BLIND RECRUITMENT) - Java

개발곰발 2024. 4. 9.
728x90

📌 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

📌풀이

이 문제 전에 푼 '가장 많이 받은 선물'을 풀고 나니 아이디어를 쉽게 떠올릴 수 있었다.

 

먼저 문제의 규칙을 요약하자면 다음과 같다.

  • 동일 유저를 여러 번 신고해도 신고 횟수는 1회로 처리된다.
  • k번 이상 신고당한 유저가 있는 경우
    • 해당 유저를 신고한 모든 유저가 결과 메일을 받는다.
  • k번 이상 신고당한 유저가 없는 경우
    • 아무도 결과 메일을 받지 않는다.

그리고나서 HashMap과 int형 배열을 선언하였다.

  • HashMap map : 모든 유저의 id와 해당 인덱스를 저장하는 HashMap
  • int[] report_list : 각 유저마다 신고당한 횟수를 저장하는 int형 배열, 각 인덱스는 id_list의 인덱스와 동일하다.
  • int[][] report_index : 각 유저의 index, 해당 유저가 신고한 유저의 index로 이루어진 int형 2차원 배열

먼저 report 배열을 돌면서 각 유저마다 신고 당한 횟수를 report_list에 넣고, 신고한 유저와 신고 당한 유저를 report_index에 넣는다. 여기서 주의할 점은 만약 report_index[0][1]의 값이 1보다 크다면(=한 유저가 동일 유저를 여러 번 신고했다면) report_list[1]의 값을 하나 빼줘야한다는 점이다. 지금 생각해보니 Set을 사용했다면 중복을 더 쉽게 제거할 수 있었을 것 같다.

그 이후에는 이중 for문으로 id_list를 돌며 report_index가 0이 아닌 경우에만 mail를 증가시켜준 후, 바깥쪽 for문이 끝나면 answer 배열에 mail의 횟수를 저장시켰다. 여기서 i와 j가 같은 경우(자기 자신인 경우)와 k번 이상 신고당한 유저가 아닌 경우를 제외하면 된다.

📌 전체 코드

import java.util.*;

class Solution {
    public int[] solution(String[] id_list, String[] report, int k) {
        Map<String, Integer> map = new HashMap<>();
        for (int i = 0; i < id_list.length; i++) {
            map.put(id_list[i], i);
        }
        
        int[] report_list = new int[id_list.length];
        int[][] report_index = new int[id_list.length][id_list.length];
        for (String s : report) {
            String[] names = s.split(" ");
            String userId = names[0];
            String reportId = names[1];
            
            report_list[map.get(reportId)]++;
            report_index[map.get(userId)][map.get(reportId)]++;
            
            if (report_index[map.get(userId)][map.get(reportId)] > 1) report_list[map.get(reportId)]--;
        }
        
        int[] answer = new int[id_list.length];
        for (int i = 0; i < id_list.length; i++) {
            int mail = 0;
            for (int j = 0; j < id_list.length; j++) {
                if (i == j) continue;
                int reportCount = report_list[map.get(id_list[j])];
                if (reportCount < k) continue;
                if (report_index[i][j] != 0) mail++; 
            }
            answer[i] = mail;
            mail = 0;
        }
        
        return answer;
    }
}