프로그래머스 문제 - 신고 결과 받기

JUNWOO KIM·2024년 3월 12일
0

알고리즘 풀이

목록 보기
85/105

프로그래머스 신고 결과 받기 문제 풀이를 진행하였습니다.

문제 해석

문제를 읽으면 아래와 같은 해석이 가능합니다.

각 유저들을 나머지 유저들을 신고할 수 있습니다.
유저들은 다른 유저들에게 일정량의 신고를 받으면 정지가 되며 정지가 된 유저를 신고한 유저들은 각각 처리 결과 메일을 받습니다.
한 유저가 같은 유저를 여러 번 신고하여도 1번으로 취급합니다.
각 유저별로 처리 결과 메일을 받은 횟수를 배열에 저장하여 return해야 합니다.

문제 풀이

각 유저들이 누구를 신고하였는지 2차원 배열에 저장하여 몇번의 신고를 받았는지 쉽게 알아낼 수 있습니다.
각 신고 내용을 배열에 저장하기 위해 각 유저들을 인덱스로 변환시켜 저장해두면 편하게 배열을 사용할 수 있으므로 HashMap을 사용하여 String-Integer로 차례대로 저장하여 사용해줍니다.

2차원 배열에 모든 신고 내역을 정리하여 저장 후 일정량 이상을 신고받은 유저를 찾아내어 배열에 메일 횟수를 따로 저장해주면 됩니다.

전체 코드

java와 cpp가 그렇게 많이 달라지지 않아 쉽게 알고리즘을 해결할 수 있었습니다.

import java.util.*;

class Solution {
    
    public int[] solution(String[] id_list, String[] report, int k) {
        int[] answer = new int[id_list.length];
        int[][] userMap = new int[id_list.length+1][id_list.length];
        HashMap<String, Integer> map = new HashMap<String, Integer>();
        
        //String으로 된 이름을 Integer로 쉽게 접근하기 위해 해시맵에 (이름, 번호)로 저장
        for(int i = 0; i < id_list.length; i++)
        {
            map.put(id_list[i], i);
        }
        //2차원 배열에 신고한 이력 저장
        for(int i = 0; i < report.length; i++)
        {
            String[] split = report[i].split(" ");
            if(userMap[map.get(split[0])][map.get(split[1])] == 0)
            {
                userMap[map.get(split[0])][map.get(split[1])]++;
                userMap[id_list.length][map.get(split[1])]++;
            }
        }
        //신고한 사람들 중 k이상으로 신고된 사람은 메일을 받은 횟수를 더해줌
        for(int i = 0; i < id_list.length; i++)
        {
            if(userMap[id_list.length][i] >= k)
            {
                for(int j = 0; j < id_list.length; j++)
                {
                    if(userMap[j][i] == 1)
                        answer[j]++;
                }
            }
        }
        
        return answer;
    }
}

출저

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

profile
게임 프로그래머 준비생

0개의 댓글