출처 : 프로그래머스
import java.util.Arrays;
class Solution {
public String[] solution(String[] strings, int n) {
return Arrays.stream(strings).sorted().sorted((s1, s2) -> s1.charAt(n) - s2.charAt(n)).toArray(String[]::new);
}
}
중간 인덱스 값의 문자열이 같을 땐, 사전순으로 정렬해야 할 것을 대비해서
먼저 정렬 해준 후 n번째 인덱스에 있는 아스키값을 이용해 정렬하고
toArray로 스트링 배열을 만들어 바로 return했다.
쉬웠다.
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
class Solution {
public int[] solution(String[] id_list, String[] report, int k) {
// 아이디, 신고당한 횟수 저장용 Map / 아이디별 메일 보낼 횟수 저장용 Map 생성
Map<String, Integer> idList = new HashMap<>();
Map<String, Integer> reportUser = new HashMap<>();
// 생성한 Map Key값 = id_list / Value 값 = 0으로 초기화
for (var i: id_list) {
idList.put(i,0);
reportUser.put(i,0);
}
// 중복제거하기 ex) "ryan con", "ryan con" ... -> "ryan con"
List<String> reportlist = Arrays.stream(report).distinct().collect(Collectors.toList());
// 신고당한 횟수 저장
for (var i : reportlist) {
String[] s = i.split(" ");
reportUser.put(s[1], reportUser.get(s[1]) +1);
}
// 신고횟수 (value)값이 k 이상일 경우에만 메일 보낼횟수 +1
for (var i : reportlist) {
String[] str = i.split(" ");
if(reportUser.get(str[1]) >= k) {
idList.put(str[0], idList.get(str[0]) +1);
}
}
//int[]로 반환하기 위해 배열 생성
int[] answer = new int[id_list.length];
// Map 순서보장 X 처음 받은 id_list의 순서에 맞게 value값 넣기
for (int i = 0; i < id_list.length; i++) {
answer[i] = idList.get(id_list[i]);
}
return answer;
}
}
스트림을 배우고 나서 당당하게 알고리즘으로 스트림 연습하겠다는 당찬 포부와는 달리
정작 스트림 쓴 건 중복 제거하는 한 줄이 다였다.
..이게 맞나..!
심지어 리스트로 만드는 과정을 IDEA에서 작업할 때에는
List<String> reportlist = Arrays.stream(report).distinct().toList();
로 썼었는데,
막상 코드를 제출하려고 하니
계속 오류가 나길래 예전에 썼었던 스트림을 리스트로 만드는 방법으로 시도했더니
잘 넘어갔다.
자바 버전 차이인지 한 번 알아봐야겠다.