class Solution {
public int[] solution(int[] arr) {
if(arr.length == 0 ||
arr.length == 1 && arr[0] == 10
) return new int[] {-1}; // 문제 지정 조건
int min = arr[0];
int minIdx = 0;
for(int i = 0; i < arr.length; i++) { // i=1 부터 (min=arr[0])
int num = arr[i];
if(min > num) {
min = num;
minIdx = i;
}
}
// 가장 작은 수 제거하기
int[] answer = new int[arr.length-1];
int answerIdx = 0;
for(int i = 0; i < arr.length; i++){
if(i != minIdx) {
answer[answerIdx] = arr[i];
answerIdx++;
}
}
return answer;
}
}
가장 작은 수 제거하기 부분에서
처음에는 answerIdx없이 i를 활용해보려고 했는데 시간이 모자를 것 같았고, 이미 코드도 충분히 길어져서 변수를 따로 빼는 것이 코드 이해에 도움이 될거라 생각해 그대로 완성했다.
answerIdx를 없애려면 아래처럼 기존 배열의 최소값 인덱스 이후에 오는 값을 당겨서 작성하면 된다. 그런데 이러면 인덱스 계산이 추가되어 else분기가 추가되고 직관성이 더 더 떨어진다.
for (int i = 0; i < arr.length; i++) {
if (i < minIdx) {
answer[i] = arr[i];
} else if (i > minIdx) {
answer[i - 1] = arr[i];
}
}
또
int[] answer;
로 선언만하고 그대로 리턴을 했더니 초기화가 되지 않아서 오류가 났다.
배열을 선언했을 때, 크기를 지정해주는 것을 잊으면 안된다.
코드가 복잡하면 stream으로 변경하는 것도 좋은 방법일 듯 하다.
int min = Arrays.stream(arr).min().getAsInt();
return Arrays.stream(arr)
.filter(n -> n != min)
.toArray();