카테고리 없음

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

hyeseong-dev 2024. 10. 14. 15:39

제일 작은 수 제거하기

문제 설명

정수를 저장한 배열, 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. 최솟값 찾기: 배열을 순회하며 가장 작은 값을 찾습니다.
  2. 새로운 배열 생성: 찾은 최솟값을 제외한 나머지 값들을 새로운 배열에 복사합니다.
  3. 빈 배열 처리: 만약 새로운 배열이 비어있다면 [-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: ArrayListint[] 배열로 변환합니다.

핵심 포인트

  • Stream API: 간결하고 효율적인 코드 작성 가능
  • 최솟값 찾기: min() 메서드 활용
  • 필터링: filter()를 사용하여 조건에 맞는 값만 추출
  • 배열 변환: toArray()를 사용하여 리스트를 배열로 변환

어떤 풀이를 선택할지는 코드 가독성과 개인의 선호에 따라 다릅니다. Stream API를 사용한 코드가 더 간결하지만, for문을 사용한 코드가 더 직관적일 수 있습니다.

주의:

  • 배열 수정: 원본 배열을 수정하지 않고 새로운 배열을 생성하는 방식으로 문제를 해결했습니다.
  • 최적화: 더 효율적인 알고리즘이 존재할 수 있지만, 이 문제의 경우 간단한 방법으로 충분히 해결할 수 있습니다.