프로그래머스 신고 결과 받기 문제 풀이를 진행하였습니다.
문제를 읽으면 아래와 같은 해석이 가능합니다.
각 유저들을 나머지 유저들을 신고할 수 있습니다.
유저들은 다른 유저들에게 일정량의 신고를 받으면 정지가 되며 정지가 된 유저를 신고한 유저들은 각각 처리 결과 메일을 받습니다.
한 유저가 같은 유저를 여러 번 신고하여도 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