[2022 KAKAO BLIND RECRUITMENT] 신고 결과 받기

최민길(Gale)·2023년 3월 13일
1

알고리즘

목록 보기
53/172

문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/92334

[이 문제는 프로그래머스에서 푼 문제입니다.]
이 문제는 HashMap을 이용하여 풀 수 있습니다. 신고를 한 사람과 신고를 당한 사람의 인덱스를 HashMap에서 <사람 이름, 인덱스>로 저장하여 배열에서 사람 이름을 찾으면 해당 인덱스를 가져오는 방식으로 문제의 조건을 처리하면 됩니다.

다음은 코드입니다.

import java.util.*;

class Solution {
    public int[] solution(String[] id_list, String[] report, int k) {
        // HashMap에 id의 인덱스 저장
        HashMap<String,Integer> ids = new HashMap<>();
        for(int i=0;i<id_list.length;i++){
            ids.put(id_list[i],i);
        }
        
        // 유저의 신고 여부 체크
        boolean[][] check = new boolean[id_list.length][id_list.length];
        
        // 신고 내역 정리
        int[] report_list = new int[id_list.length];
        int[] reported_list = new int[id_list.length];
        int[] answer = new int[id_list.length];
        for(int i=0;i<report.length;i++){
            StringTokenizer st = new StringTokenizer(report[i]);
            String sendID = st.nextToken();
            String receiveID = st.nextToken();
            
            int sendIdx = ids.get(sendID);
            int receiveIdx = ids.get(receiveID);
            
            // 한 유저가 신고한 신고 횟수는 1회
            if(!check[receiveIdx][sendIdx]){
                check[receiveIdx][sendIdx] = true;
                reported_list[receiveIdx]++;
            }
        }
        
        // 신고당한 횟수가 k보다 작을 경우 0으로 치환
        for(int i=0;i<reported_list.length;i++){
            if(reported_list[i] <k) reported_list[i] = 0;
            else{
                // 체크 배열 조사해서 신고 기록이 있으면 해당 인덱스 ++
                for(int j=0;j<check.length;j++){
                    if(check[i][j]) answer[j]++;
                }
            }
        }

        return answer;
    }
}

profile
저는 상황에 맞는 최적의 솔루션을 깊고 정확한 개념의 이해를 통한 다양한 방식으로 해결해오면서 지난 3년 동안 신규 서비스를 20만 회원 서비스로 성장시킨 Software Developer 최민길입니다.

0개의 댓글

관련 채용 정보