출처: https://school.programmers.co.kr/learn/courses/30/lessons/12935
문제 설명
정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.
제한 조건
arr은 길이 1 이상인 배열입니다.
인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다.
입출력 예
arr return
[4,3,2,1][4,3,2]
[10][-1]
내가 작성한 코드문
import java.util.*;
class Solution {
public int[] solution(int[] arr) {
List<Integer> list = new ArrayList<>();
for (int num : arr) {
list.add(num); // 박싱 필요
}
// 2. 내림차순 정렬 직접 구현
list.sort((a, b) -> b - a);
// Collections.sort(list, Collections.reverseOrder());// 내림 차순 정렬
if(list.size() == 1){// 값이 하나일 경우 조건문 순서 변경
return new int[]{-1};
// list.remove(0);// 마지막 값 삭제
// list.add(-1);
} else if (!list.isEmpty()) { // arr 에서 가장 작은 수를 제거한 배열을 리턴
list.remove(list.size() - 1);// 마지막 값 삭제
}
// 리스트 -> 배열 변환
int answer[] = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
answer[i] = list.get(i); // 언박싱
}
return answer;
}
}
코드 실행 했을때는 둘다 맞았다.
근데 제출후 채점 했을 때는 0점이었다.
현재 코드의 큰 문제점은 내림 차순을 해서 마지막 요소를 제거 하는 방식인데
그런 요구사항은 없었다는 것이다.
list.sort((a, b) -> b - a); // 내림차순 정렬
list.remove(list.size() - 1); // 마지막 요소 제거
모범답안
import java.util.*;
class Solution {
public int[] solution(int[] arr) {
if (arr.length == 1) return new int[]{-1};
// 1. 최소값 찾기
int min = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] < min) min = arr[i];
}
// 2. 최소값 제거
List<Integer> list = new ArrayList<>();
for (int num : arr) {
if (num != min) list.add(num);
}
// 3. 리스트 -> 배열 변환
int[] answer = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
answer[i] = list.get(i);
}
return answer;
}
}
처음부터 arr배열 길이가 1인지 확인후 맞다면 -1로 원소를 바꾼후 시작한다.
최솟값 찾기 아니까 패스
최솟값 아닌 값만 리스트에 저장
리스트 -> 배열로 변환
다른 사람의 풀이
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(arr)
→ arr을 IntStream으로 변환한다. (int[] → IntStream)
.min()
→ 스트림에서 가장 작은 값을 구한다.
리턴값은 OptionalInt 타입이다.
.getAsInt()
→ OptionalInt에서 실제 값을 꺼낸다.
다시 한 번 arr을 스트림으로 변환한다.
.filter(i -> i != min)
→ min 값과 같은 요소는 제거한다 (조건: 같지 않은 것만 통과)
.toArray()
→ 남은 값들을 int[] 배열로 다시 반환한다.
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;
// 1. 가장 작은 수의 인덱스를 찾는다
for(int i=0;i<arr.length;i++){
if(arr[minIndex]>arr[i]){
minIndex = i;
}
}
// 2. 가장 작은 수를 제거하기 위해 뒤의 값을 한 칸씩 당긴다
for(int i=minIndex+1;i<arr.length;i++){
arr[i-1] = arr[i];
}
// 3. arr 배열 앞부분을 answer에 복사
for(int i=0;i<answer.length;i++){
answer[i] = arr[i];
}
return answer;
}
}
마지막거는 리스트 없이 배열만으로 가능한 삭제 알고리즘