제일 작은 수 제거하기
문제 설명
정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.
제한 조건
arr은 길이 1 이상인 배열입니다.
인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다.
입출력 예
작성코드
import java.util.Arrays;
import java.util.ArrayList;
class Solution {
public int[] solution(int[] arr) {
int[] temArr = arr.clone(); //①
Arrays.sort(temArr); //②
int min = temArr[0]; //③
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < arr.length; i++){ //④
if(arr[i] != min)
list.add(arr[i]);
}
int[] answer = {};
if(list.size() == 0) { //⑤
answer = new int[1];
answer[0] = -1;
} else { //⑥
answer = new int[list.size()];
for(int i = 0; i < list.size(); i++) {
answer[i] = list.get(i);
}
}
return answer;
}
}
코드설명
① temArr 배열에 입력받은 arr배열을 그대로 복제한다.
② Arrays.sort 메서드를 이용해 배열을 오름차순으로 정렬해준다.
TIP_ 만약 내림차순으로 정렬하고 싶다면?
기본적으로 Arrays.sort메서드는 오름차순만 지원한다. 하지만 내림차순으로 정렬을 하고 싶다면 아래와 같이 사용할 수 있다.
Arrays.sort(temArr, Collections.reverseOrder());
③ 이제 오름차순 정렬이 되었으니, 배열의 첫번째값 즉 0번 인덱스에 가장 작은 값을 min변수에 담아준다.
④ 비교하여 담을 공간인 list를 생성하고 for문으로 arr[i]번재 값과 min 값과 같이 않으면 list에 넣어준다.
⑤ 여기서 문제에서 제시한 조건인 10이면 -1을 반환한다. 즉, 배열의 값이 하나이고 해당 값이 제일 작은 값이라면 -1을 반환한다는 조건이다. c에서 우린 제일 작은값을 min에 값을 담아주었다. 따라서 d에서는 list에 아무런 값도 담기지 않았을 것이다. 그래서 위와 같은 조건식을 작성해준다.
만약 list.size가 0 라면, -1만 출력해야 함으로 배열의 크기를 1로 지정해주고 0번 인덱스에 -1 값을 넣어준다.
⑥ 위의 ⑤조건이 아니라면 answer는 list.size값으로 크기를 초기화 시켜주고 for문을 통해 answer배열에 값을 하나씩 넣어주면 된다.
다른 사람의 풀이
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();
}
}
Arrays.stream으로 하면 간단하게 더욱 간결하게 되는것 같다. 단, 코드는 짧기만 속도면에서 좋지 않다고 한다. 참.. 같은 문제인데 사람마다 푸는 방식이 모두 다른것 같다. Arrays.stream 함수가 뭔지도 알아봐야겠다. 끝!