[JAVA] 제일 작은 수 제거하기

태로미·2023년 9월 18일
0

Programmers

목록 보기
18/29
post-thumbnail

❓문제


정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요.
단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요.
예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.



🚫제한


  • arr은 길이 1 이상인 배열입니다.
  • 인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다.


💻입출력 예


arrreturn
[4,3,2,1][4,3,2]
[10][-1]













📝해결


1. Stream_filter

class Solution {
	public int[] solution(int[] arr) {
        
      if(arr.length == 1){
          arr[0] = -1;
          return arr;
      }
        
	  int min = Arrays.stream(arr).min().getAsInt();
      return Arrays.stream(arr).filter(i -> i != min).toArray();
    }
}
  • 배열의 길이가 1이라면 원소가 하나밖에 없다는 뜻, -1을 return해야 함.
    • arr[0]에 -1의 값을 주고 바로 return.
  • 배열 arr을 스트림으로 생성해서 min() 메서드로 최소 값을 구한 뒤, getAsInt() 메서드로 정수 값을 구함.
  • 스트림의 filter 기능은 스트림 내 요소들을 하나씩 평가해서 걸러낼 수 있음.
  • 배열 원소 중 최소값인 것만 제외하여 스트림을 반환한 후, 다시 배열로 변환.
  • 스트림이라는게 내부반복자를 사용하기 때문에 개발자의 코드는 줄어들지만, 성능적으로 순수 코드보다 더 오랜 시간이 걸릴 수 있음.
    • 해당 문제에서는 for문을 사용하는 것이 좀 더 효율적.

2. for문

class Solution {
	public int[] solution(int[] arr) {

      if(arr.length == 1){
        int[] answer = {-1};
        return answer;
      }

      int[] answer = new int[arr.length-1];

      int minIndex = 0;
      for(int i=0; i<arr.length; i++){
        if(arr[minIndex] > arr[i]){
            minIndex = i;
        }
      }

      for(int i=minIndex+1; i<arr.length; i++){
          arr[i-1] = arr[i];
          // minIndex가 '3'이라는 가정
          // arr[3] = arr[4]
          // arr[4] = arr[5]
          // ... 배열 길이만큼 반복
      }

      for(int i=0; i<answer.length; i++){
          answer[i] = arr[i];
      }

      return answer;
	}
}    
  • 배열의 길이가 1이라면 배열 answer에 -1을 초기화하고 바로 return.
  • 최소값 하나를 제외하므로 배열 answer의 길이는 arr.length-1이 됨.
  • 자연수 중에서 제일 작은 값은 0이므로 minIndex의 값을 0으로 미리 초기화.
  • for문으로 배열을 돌며 arr[0]의 값이 arr[i] 보다 크다면 minIndex의 값은 i.
    • 배열의 최소값을 가진 index를 구하는 과정.
  • 배열의 최소값 index+1부터 배열을 한 바퀴 돌면서, 최소값을 제외한 원소들을 차례대로 배열에 담음.
    • minIndex가 최소값을 가진 index이므로,
      minIndex+1을 i의 값으로 해서 그 다음 원소부터 탐색함.
    • 만약, minIndex가 3이라면 배열의 최소값은 arr[3].
    • arr[3]의 자리에 arr[4]의 값을 넣음으로써 뒤의 값들도 하나씩 자리를 앞으로 옮기게 되는데, 이렇게 최소 값을 배열에서 제외시킴.
  • 배열 answer에 최소값을 제외한 배열 arr의 값을 차례대로 저장 후 return.






💭마무리

  • Level_1 / 20:35
  • Point
    – Stream의 filter기능
    – 배열에서 최소 값을 가진 index 구하기
    – 배열에서 최소 값 제외시키기

코테를 하면서 다양한 배열의 기능을 알아가는 것 같다ㅎ_ㅎ
오늘 익힌 최소값 index 구하기와 최소 값 제외시키는 것 또한 유용하게 써먹을듯!
뭣보다 스트림을 사용한다고 해서 무조건 빠르단게 아니란걸 알았는데,,,
역시 튜닝의 끝은 순정인걸까,,,☆★


profile
Here And Now

0개의 댓글