https://school.programmers.co.kr/learn/courses/30/lessons/92334
문제를 풀려면 다음 데이터들을 저장해야한다.
1. 각 사용자가 신고 당한 횟수
2. 각 사용자가 신고한 사용자 리스트
저장할 데이터를 보면 각 사용자 별로 저장해야한다는 특징이 있다
즉, key-value의 형식으로 key는 각 사용자, value는 차단 당한 횟수 또는 신고한 리스트이다.
key-value의 값을 저장하는 자료 구조는 Map이므로 아래와 같이 정의해준다.
Map<String,Integer> BlockMap = new HashMap<String,Integer>(); // 유저-차단당한 횟수
Map<String, ArrayList<String>> ReportMap = new HashMap<>(); // 유저-차단한 유저리스트
첫 번째 포인트!
Map<String, ArrayList<String>>
와 같이 value 값으로 리스트를 넣을 수 있다!
이걸 몰라서 한참 고민했다.
Map 관련 함수
- 삽입 :
Map.put(key,value)
- 수정 :
Map.replace(key,value)
orMap.put(key,value)
- 데이터가 있는 상태에서
Map.put(key,value)
을 하면 해당 key 값이 수정됨(key는 중복될 수 없기 때문)- value값 가져오기:
Map.get(key)
두 Map의 값을 구하는 로직은 다음과 같다.
String user=r.split(" ")[0];
String block= r.split(" ")[1];
ArrayList<String> list =ReportMap.get(user);
list.add(block);
ReportMap.put(user,list);
BlockMap.put(block , BlockMap.get(block) + 1);
두 번째 포인트!
Map은 순서가 없는 자료 구조이다
처음에 각 유저별로 신고 처리 메일 개수도 Map에 저장한 후 리스트로 반환하려고 했다.
그런데 Map에 저장하니.. 처음 받은 id_list(유저 리스트)의 순서와 Map의 순서가 달라지게 됐다!
output 형식이 input의 유저 순서와 동일해야 하기 때문에 순서가 없는 Map으로 저장하는 방식은 문제가 있었다.
int[] answer에 처리 메일 개수를 저장하는 방식으로 변경한 후,
각 유저의 차단 리스트를 순회하며 신고한 사용자가 정지 대상이면
answer 배열의 값을 변경하는 식으로 수정했다.
for(int i=0;i<id_list.length;i++){
// 각 유저의 차단 리스트
List<String> repList=ReportMap.get(id_list[i]);
for(String user:repList){
// 차단한 유저가 이용 정지면 메일 개수 추가
if(BlockMap.get(user)>=k) answer[i]++;
}
}
GitHub Java-algorithm-practice/프로그래머스/lv1/92334. 신고 결과 받기/
import java.util.*;
class Solution {
public int[] solution(String[] id_list, String[] report, int k) {
int[] answer = new int[id_list.length];
Map<String,Integer> BlockMap = new HashMap<String,Integer>(); // 유저-차단당한 횟수
Map<String, ArrayList<String>> ReportMap = new HashMap<>(); // 유저-차단한 유저리스트
// 차단 중복 제거
report = Arrays.stream(report).distinct().toArray(String[]::new);
// Map 초기화
for(String u:id_list){
BlockMap.put(u,0);
ReportMap.put(u,new ArrayList<>());
}
for(String r:report){
String user=r.split(" ")[0];
String block= r.split(" ")[1];
// 유저-차단한 유저리스트 갱신
ArrayList<String> list =ReportMap.get(user);
list.add(block);
ReportMap.put(user,list);
// 차단 횟수 갱신
BlockMap.put(block , BlockMap.get(block) + 1);
}
for(int i=0;i<id_list.length;i++){
// 각 유저의 차단 리스트
List<String> repList=ReportMap.get(id_list[i]);
for(String user:repList){
// 차단한 유저가 이용 정지면 메일 개수 추가
if(BlockMap.get(user)>=k) answer[i]++;
}
}
return answer;
}
}