본문 바로가기
알고리즘/문제 풀이

[Java] 프로그래머스 > 제일 작은 수 제거하기

by _eunji_ 2022. 1. 27.

 

https://programmers.co.kr/learn/courses/30/lessons/12935

 

코딩테스트 연습 - 제일 작은 수 제거하기

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

programmers.co.kr

 

문제 설명

  • 정수를 저장한 배열, arr에서 가장 작은 수를 제거한 배열을 리턴하는 함수
  • 단, 리턴하는 배열이 빈 배열일 경우 배열에 -1을 채워 리턴

제한조건

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

 

내 풀이

import java.util.*;
class Solution {
    public int[] solution(int[] arr) {
        int[] answer = {};
        ArrayList<Integer> list =new ArrayList<>();
        
        if(arr.length==1){
            answer = new int[1];
            answer[0]=-1;
        }
        else{
            int min=arr[0];
            for(int i=1;i<arr.length;i++){
                if(min>arr[i]) min=arr[i];
            }
            
            for(int i=0;i<arr.length;i++){
                if(arr[i]!=min) list.add(arr[i]);
            }
            
           answer = new int[list.size()];

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

가변적인 크기를 가지는 ArrayList를 사용하였다.

 

arr 배열의 크기가 1인 경우

최솟값을 제거하고 리턴하면 answer 배열의 크기가 0이 되기 때문에 -1을 채워 리턴한다.

 

배열의 크기가 1보다 큰 경우

우선 반복문을 통해 최솟값을 찾는다.

반복문을 통해 arr 원소 값과 최솟값이 같지 않을 때 list에 원소 값을 추가한다.

반복문을 통해 결과를 리턴해주는 answer 배열에 list값을 하나씩 대입한다.

=> 반복문을 많이 사용한 비효율적인 코드이다.

 

 

다른 풀이

import java.util.Arrays;
import java.util.stream.Stream;
import java.util.List;
import java.util.ArrayList;

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();
  }
}

배열 스트림을 생성하여 최솟값을 구한다.

filter 함수를 사용하여 최솟값과 같지 않은 arr원소들을 걸러내고 배열로 변환해 반환한다.

댓글