너무 길어서 링크로 대체합니다. 문제링크
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
class Solution {
public int[] solution(String[] id_list, String[] report, int k) {
LinkedHashMap<String, Integer> report_map = new LinkedHashMap<>();
LinkedHashMap<String, List<String>> report_list = new LinkedHashMap<>();
for (String str : id_list) {
report_map.put(str, 0);
report_list.put(str, new ArrayList<>());
}
for (String str : report) {
String reporter = str.split(" ")[0];
String reported = str.split(" ")[1];
if (!report_list.get(reporter).contains(reported)) {
report_list.get(reporter).add(reported);
report_map.put(reported, report_map.getOrDefault(reported, 0) + 1);
}
}
int[] answer = new int[id_list.length];
int count = 0;
for (String str : id_list) {
List<String> tmp = report_list.get(str);
for (String s : tmp) {
if (report_map.get(s) >= k) {
answer[count]++;
}
}
count++;
}
return answer;
}
}
저는 일단 어떻게 풀지 고민했는데, 문제를 쭉 일어보니 생각나는건 링크드해쉬맵
밖에 없었어요.
그리고 두개를 사용해야겠다 생각했어요.
링크드해쉬맵을 사용해야 id_list대로 정답배열을 꾸리기 편할 것 같았고,
그래야 순서를 유지할 수 있어서 링크드해쉬맵을 사용했습니다.
여기는
하나는 이름별 신고당한횟수 report_map이고
하나는 이름별 신고한 사람들 목록인 report_list입니다
그렇게 초기 map을 생성합니다.
그리고 각자 신고한 리스트를 만들고, 신고당한 횟수를 카운팉ㅇ합니다.
여기 if문이 뭐냐면
내가 신고한 목록에 신고할 사람이 없을때만 신고한 리스트에 더하고
신고횟수를 +1 해주는겁니다.
일단 왜 이렇게 했냐면 동일한 유저에 대한 신고는 1회로 처리하기 때문에
신고한 목록에 없을때만 신고리스트에 넣고 신고횟수를 늘리려했습니다.
그렇게 각자 신고한 리스트와 신고횟수가 만들어졌으면
정답배열을 생성하는데, 정답배열은 id_list순서대로 해야하기 때문에
id_list 길이로 생성합니다.
그렇게 이중for문을 사용하는데, 어차피 정답배열도 id_list대로 하기 떄문에
id_list에 있는 값을 활용해서 큰 포문을 돕니다.
그때 신고한 목록을 확인하기 위해서 list로 받고, 이 list에서 각각의 이름을 뺴옵니다.
결과적으로 정답배열에는 내가 신고한 사람들 중 정지먹은 사람들의 횟수이기때문에
내가 신고한 리스트의 각각의 이름들의 신고횟수를 확인합니다.
그게 내부for문이구요.
그래서 tmp로 신고한 리스트를 받고, 각각의 이름이 신고횟수가 k번 이상일 때
해당 정답배열 인덱스에 ++을 해줬습니다.
마지막으로 정답배열을 리턴하면 끝이빈다.
내가 스터디때 이야기하려고 미리 작성해놓은 글을 퍼왔다.
이 문제는 처음에 어려울 것 같았지만 생각보다 재밌었고 한번에 풀려서 너무 좋았지만 리팩토링이 필수로 여겨진다.
[링크] : 개인저장소