제일 작은 수 제거하기 (자바)

김재현·2024년 4월 19일
0

알고리즘 풀이

목록 보기
72/89
post-custom-banner

문제

정답 코드

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();
  }
}
  1. 우선 배열의 크기가 1인 경우, 정답은 -1이 되어야하므로 if문으로 미리 처리해놨다.
  2. 그 후 stream의 min()을 이용해서 가장 작은 수를 뽑아낸 뒤, int로 받아준다. (stream의 getAsInt() 사용)
  3. 마지막으로 stream의 filter()를 이용하여 min에 해당하는 값은 제외하고 배열로 만들어준다.

이렇게 간단하게 3줄로 풀이해 낼 수도 있는 문제였다!
알고리즘 풀이는 조금 다른 결이 있지만, 그래도 개발자라면 가독성 좋고 간결한 코드를 지향해보자.

그렇지만 코드가 간결하다고 성능까지 좋은 것은 아니다. stream을 사용한 것이 경우에 따라 100배 느린 것을 볼 수 있다.
stream을 사용하며 for문 보다 처리해야하는 과정이 복잡해졌기 때문이다.
이러한 성능 문제는 앞으로도 계속해서 고민해봐야 될것이다.

  • for문을 이용한 풀이
  • stream을 이용한 풀이
profile
I live in Seoul, Korea, Handsome
post-custom-banner

0개의 댓글