array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.
divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.
arr은 자연수를 담은 배열입니다.
정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j] 입니다.
divisor는 자연수입니다.
array는 길이 1 이상인 배열입니다.
Stream을 쓰면 굉장히 쉽게 풀 수 있을 것 같다.
그럼 Stream으로도 풀어보고 Array만 써서도 풀어보자.
Array만 써서 풀 때는 성능을 최대한 고려해보자.
// Stream 사용 시
import java.util.*;
class Solution {
public int[] solution(int[] arr, int divisor) {
int[] result = Arrays.stream(arr)
.filter(i -> i%divisor == 0)
.sorted()
.toArray();
return result.length == 0 ? new int[]{-1} : result;
}
}
Kotlin이었다면 비어있는 지 검사하는 로직도 스트림에 포함시킬 수 있었을 텐데 아쉽다.
// Array만 사용한다면 + 성능 고려
import java.util.*;
public class Solution {
public int[] solution(int[] arr, int divisor) {
int curr = 0;
int last = arr.length;
while(true) {
if(curr == last || curr > arr.length) break;
if (arr[curr] % divisor == 0) {
curr++;
continue;
}
int start = curr;
int end = start + 1;
while (end < last && arr[end] % divisor != 0) {
end++;
}
moveLeft(arr, start, end, last);
last -= end - start;
}
if(last < 1) return new int[]{-1};
int[] result = new int[last];
System.arraycopy(arr, 0, result, 0, last);
Arrays.sort(result);
return result;
}
public void moveLeft(int[] arr, int start, int end, int last) {
for(;end < last;) {
arr[start++] = arr[end++];
}
}
}
한 번의 루프 안에서 해결하고자 했다.
while을 두 개 썼지만 index는 한 번만 루프를 돈다.
코드 가독성이 굉장히 떨어지지만 성능은 확실히 낫다.
Stream 짱짱맨