제일 작은 수 제거하기
문제 설명
정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.
제한 조건
- arr은 길이 1 이상인 배열입니다.
- 인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다.
입출력 예
[4,3,2,1] | [4,3,2] |
---|---|
[10] | [-1] |
문제 이해
- 입력: 정수 배열 arr
- 출력: arr에서 가장 작은 수를 제거한 새로운 배열
- 예외: 배열이 비어있을 경우 [-1]을 반환
- 조건: 배열의 모든 원소는 서로 다름
풀이 방법
- 최솟값 찾기: 배열을 순회하며 가장 작은 값을 찾습니다.
- 새로운 배열 생성: 찾은 최솟값을 제외한 나머지 값들을 새로운 배열에 복사합니다.
- 빈 배열 처리: 만약 새로운 배열이 비어있다면 [-1]을 반환합니다.
Java 코드 (Stream API 활용)
import java.util.Arrays;
import java.util.stream.Collectors;
class Solution {
public int[] solution(int[] arr) {
int min = Arrays.stream(arr).min().getAsInt(); // 최솟값 찾기
return arr.length == 1 ? new int[]{-1} : // 배열 길이가 1이면 -1 반환
Arrays.stream(arr)
.filter(num -> num != min)
.toArray(); // 최솟값이 아닌 값들로 새로운 배열 생성
}
}
코드 설명
- 최솟값 찾기:
Arrays.stream(arr).min().getAsInt()
를 사용하여 배열에서 가장 작은 값을 찾습니다. - 빈 배열 처리:
arr.length == 1
조건을 통해 배열의 길이가 1인 경우 바로[-1]
을 반환합니다. - 새로운 배열 생성:
filter
를 사용하여 최솟값이 아닌 값들만 추출하고,toArray()
를 사용하여 새로운 배열로 변환합니다.
다른 풀이
import java.util.ArrayList;
import java.util.List;
class Solution {
public int[] solution(int[] arr) {
if (arr.length == 1) return new int[]{-1};
int min = arr[0];
for (int num : arr) {
min = Math.min(min, num);
}
List<Integer> list = new ArrayList<>();
for (int num : arr) {
if (num != min) {
list.add(num);
}
}
int[] answer = new ArrayList<>(list).stream().mapToInt(Integer::intValue).toArray();
return answer;
}
}
- for문:
for
문을 사용하여 최솟값을 찾고, 새로운 리스트에 최솟값이 아닌 값들을 추가합니다. - List to Array:
ArrayList
를int[]
배열로 변환합니다.
핵심 포인트
- Stream API: 간결하고 효율적인 코드 작성 가능
- 최솟값 찾기:
min()
메서드 활용 - 필터링:
filter()
를 사용하여 조건에 맞는 값만 추출 - 배열 변환:
toArray()
를 사용하여 리스트를 배열로 변환
어떤 풀이를 선택할지는 코드 가독성과 개인의 선호에 따라 다릅니다. Stream API를 사용한 코드가 더 간결하지만, for문을 사용한 코드가 더 직관적일 수 있습니다.
주의:
- 배열 수정: 원본 배열을 수정하지 않고 새로운 배열을 생성하는 방식으로 문제를 해결했습니다.
- 최적화: 더 효율적인 알고리즘이 존재할 수 있지만, 이 문제의 경우 간단한 방법으로 충분히 해결할 수 있습니다.