728x90
[ 2022 KAKAO BLIND RECRUITMENT - 신고 결과 받기 ]
https://school.programmers.co.kr/learn/courses/30/lessons/92334
[접근 방법 - 내가 해결한 방법]
1. 2차원 배열로 '신고 내역 (recode)' 을 기록한다.
2. k 번 이상 신고 당한 '정리 회원 리스트 (ban_list)' 를 작성한다.
3. 신고자에게 메일 발송 수 리스트를 작성한다.
[JAVA 코드 - 내가 해결한 방법]
import java.util.*;
class PM_92334 {
public int[] solution(String[] id_list, String[] report, int k) {
int[] answer = new int[id_list.length];
Map<String, Integer> map = new HashMap<>();
for (int i = 0; i < id_list.length; i++) {
map.put(id_list[i], i);
}
//신고 기록
int[][] recode = new int[id_list.length][id_list.length];
for (String r : report) {
String[] id = r.split(" ");
recode[map.get(id[0])][map.get(id[1])] = 1;
}
//정지 유저 리스트
List<Integer> ban_list = new ArrayList<>();
for (int i = 0; i < id_list.length; i++) {
int sum = 0;
for (int j = 0; j < id_list.length; j++) {
sum += recode[j][i];
}
if (sum >= k) {ban_list.add(i);}
}
//정비 메일 발송 건수
for (int i = 0; i < id_list.length; i++) {
int sum = 0;
for (int j : ban_list) {
sum += recode[i][j];
}
answer[i] = sum;
}
return answer;
}
}
이렇게 작성하며 문제를 풀었는데, 다른 사람의 코드를 보던 중 더 깔끔한 풀이가 있어 가져왔다.
[JAVA 코드]
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
class Solution {
public int[] solution(String[] id_list, String[] report, int k) {
List<String> list = Arrays.stream(report).distinct().collect(Collectors.toList());
HashMap<String, Integer> count = new HashMap<>();
for (String s : list) {
String target = s.split(" ")[1];
count.put(target, count.getOrDefault(target, 0) + 1);
}
return Arrays.stream(id_list).map(_user -> {
final String user = _user;
List<String> reportList = list.stream().filter(s -> s.startsWith(user + " ")).collect(Collectors.toList());
return reportList.stream().filter(s -> count.getOrDefault(s.split(" ")[1], 0) >= k).count();
}).mapToInt(Long::intValue).toArray();
}
}
여기서 인상 깊은 부분이 여러군데 있어 정리하여 남겨두려고 한다.
1. stream 의 'distinct()' 를 이용해서, 중복된 신고를 모두 지운 것
List<String> list = Arrays.stream(report).distinct().collect(Collectors.toList());
2. map.getOrDefault( 'key', 'value' ) 를 이용한 것
존재하지 않은 'key' 로 조회할 경우, 기본값 'value' 값을 반환 하는 것.
count.put(target, count.getOrDefault(target, 0) + 1);
[앞으로 해야할 일]
JAVA 에 많은 부족함을 느낀다.
앞으로도 JAVA 에 능숙해 지기 위해 노력해야 한다.
728x90