[Java] 제일 작은 수 제거하기 (programmers)

Haeun Noh·2022년 12월 22일
0

programmers

목록 보기
27/64
post-thumbnail

1222


문제 설명

정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10][-1]을 리턴 합니다.


제한 조건

arr은 길이 1 이상인 배열입니다.
인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다.


입출력 예

arrreturn
[4,3,2,1][4,3,2]
[10][-1]

소스 코드

class Solution {
    public int[] solution(int[] arr) {
        int[] answer;
        if ( arr.length == 1 ) {
            answer = new int[1];
            answer[0] = -1;
            return answer;
        }
        answer = new int[arr.length-1];
        
        int min = arr[0];
        for ( int i : arr ) min = Math.min(i, min);
        
        int j = 0;
        for ( int i = 0; i < arr.length; i++) {
            if ( arr[i] == min ) continue;
            answer[j++] = arr[i];
        }
        return answer;
    }
}

소스 풀이

    public int[] solution(int[] arr) {
        int[] answer;

반환 타입이 int 배열solution메서드이다.

매개변수로는 int[]타입의 arr가 주어진다.

최솟값을 제거한 나머지 arr 값들을 저장할 answer배열을 선언해준다. 미리 배열을 생성하지 않는 이유는 arr에 들어있는 값의 개수가 한 개일 때 answer 배열의 크기가 0이 되어버리기 때문이다. 0이 되어버리면 리턴해야하는 -1을 저장할 공간이 없어지게 되기 때문에 선언만 하고 나머지 생성 부분은 if문 다음으로 미루는 것이다.


        if ( arr.length == 1 ) {
            answer = new int[1];
            answer[0] = -1;
            return answer;
        }
        answer = new int[arr.length-1];        

앞서 우려했던 상황인 arr의 크기가 1일 경우를 대비하는 if문이다.

만약 arr.length1이라면 answer을 방 1개로 생성한다. 그 후 answer[0]방에 -1을 저장한 뒤 return answer을 하여 -1을 반환시켜준다.
여기서 return -1을 안 하는 이유는 solution메서드의 반환 타입이 int[]이기 때문에 return할 때도 정수형 배열로 반환해주어야 하기 때문이다.

만약 arr.length의 크기가 2이상이라면 answer의 크기가 0이 될 가능성은 없기 때문에 arr.length-1만큼 answer배열을 생성해준다. 이 때 arr.length1을 빼는 이유는 최솟값은 답에 들어가지 않기 때문에 1을 빼준 것이다.


        int min = arr[0];
        for ( int i : arr ) min = Math.min(i, min);

최솟값을 구할 차례이다.

최솟값을 구하는 기준이 될 min변수에 arr[0]이 초기값으로 주어진다.

향상된 for문을 사용하여 for문 구조를 단순화시킨다. arr값이 없을 때까지 arr의 값들을 차례로 i에 대입시켜 주어진 문제를 풀 수 있다.

Math.min()Math클래스의 두 수 중에서 최솟값을 구하는 min()메서드이다. 두 매개변수 중에서의 최솟값을 구할 수 있다. 이 코드에서는 arr값인 imin값을 비교하여 최솟값을 min변수에 저장하는 방식으로 최솟값을 구하였다.


        int j = 0;
        for ( int i : arr ) {
            if ( i == min ) continue;
            answer[j++] = i;
        }
        return answer;

이제는 최솟값을 뺀 나머지 수들을 answer배열에 저장해야 한다.

최솟값을 뺀 나머지 수를 저장할 answer의 요솟값을 나타낼 j0으로 초기화시켜준다. 이는 arranswer의 요솟값의 변수를 차이를 둬야하기 때문이다.

마찬가지로 향상된 for문을 사용하여 문제를 풀었다. arr값이 없을 때까지 arr에 들어있는 값을 i에 대입하여 구조를 단순화하였다.

만약 imin이라면, 즉 i의 값이 최솟값이라면 continue를 사용하여 최솟값이 answer에 들어가지 않도록 하였다.
i가 최솟값이 아니라면 answerj번째 방에 i를 저장한 뒤 j의 값을 1증가시켜 다음 방을 준비한다.

최솟값을 뺀 나머지 수를 answer에 저장한 뒤에는 answerreturn하여 프로그램을 종료한다.


실행 화면



profile
기록의 힘을 믿는 개발자, 노하은입니다!

0개의 댓글