import java.util.*;
class Solution {
public int[] solution(int[] arr) {
int minIndex = 0;
for(int i=0;i<arr.length;i++) {
if(arr[i] < arr[minIndex]) {
minIndex = i;
}
}
List<Integer> arrList = new ArrayList<>();
for(int i=0;i<arr.length;i++) {
if(i!=minIndex) {
arrList.add(arr[i]);
}
}
if(arrList.size()==0) {
int[] zero = {-1};
return zero;
}
int[] answer = new int[arrList.size()];
for(int i=0;i<arrList.size();i++) {
answer[i]=arrList.get(i);
}
return answer;
}
}
풀 때 ArrayList로 변경했다가 다시 배열로 바꿔주는 과정에서 계속해서 for문을 사용하며 '너무 반복적이다', '귀찮다' 라는 생각을 했던 문제이다.
개발자라면 누구나 반복적인 것을 쉽게 처리하고자한다.
여러가지 방법이 있겠지만 이번엔 stream을 이용한 방법을 소개하겠다.
class Solution {
public int[] solution(int[] arr) {
if (arr.length <= 1) return new int[]{ -1 };
int min = Arrays.stream(arr).min().getAsInt();
return Arrays.stream(arr).filter(i -> i != min).toArray();
}
}
이렇게 간단하게 3줄로 풀이해 낼 수도 있는 문제였다!
알고리즘 풀이는 조금 다른 결이 있지만, 그래도 개발자라면 가독성 좋고 간결한 코드를 지향해보자.
그렇지만 코드가 간결하다고 성능까지 좋은 것은 아니다. stream을 사용한 것이 경우에 따라 100배 느린 것을 볼 수 있다.
stream을 사용하며 for문 보다 처리해야하는 과정이 복잡해졌기 때문이다.
이러한 성능 문제는 앞으로도 계속해서 고민해봐야 될것이다.
- for문을 이용한 풀이
- stream을 이용한 풀이