본문 바로가기

코딩 테스트

[프로그래머스] (Lv.1) 제일 작은 수 제거하기 *

728x90

문제


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

 

 

-  출력 예시  -

정답 코드


<  내 정답 코드 1  >

class Solution {
    public int[] solution(int[] arr) {
        if (arr.length == 1) {
            return new int[] {-1};
        }
        
        int[] answer = new int[arr.length - 1];
        int index = 0;
        
        for (int i = 1; i < arr.length; i++) {
            if (arr[index] > arr[i]) {
                index = i;
            }
        }

        System.arraycopy(arr, 0, answer, 0, index);
        System.arraycopy(arr, index + 1, answer, index, arr.length - index - 1);

        return answer;
    }
}

 

<  내 정답 코드 2  >

import java.util.ArrayList;
import java.util.Collections;

class Solution {
    public int[] solution(int[] arr) {
        if (arr.length == 1) {
            arr[0] = -1;
            return arr;
        }

        ArrayList<Integer> list = new ArrayList<Integer>();
        for (int i : arr) {
            list.add(i);
        }

        Integer minimum = Collections.min(list);
        list.remove(minimum);

        int[] answer = new int[arr.length - 1];

        for (int i = 0; i < list.size(); i++) {
            answer[i] = list.get(i);
        }

        return answer;
    }
}

이것을 주의하자!


-  배열의 크기는 변경할 수 없다. 따라서 단순히 배열의 원소를 삭제하는 것은 불가능하다. 따라서 2가지의 방법이 존재한다.

 

     방법 1또 하나의 배열을 만들어서 삭제하고 싶은 원소를 제외한 채 복사하기

                    ☞   크기가 1 작은 새로운 배열을 만든다.

                    ☞   배열의 최소값을 구하고, 해당 값의 인덱스를 구한다.

                            ( 최소값의 인덱스만 구하면 되기에 굳이 min 변수를 만들 필요가 없다 )

                    ☞   새로운 배열에 최소값 인덱스 전까지 복사한다.

                    ☞   새로운 배열에 최소값 인덱스 이후부터 끝까지 복사한다.

 

     방법 2 배열을 '컬렉션 프레임워크'로 변환한 다음, Collections.min() 메서드로 최소값을 삭제시킨 후

                    다시 배열로 전환하기

                    ☞   ArrayList<E> 를 만든 다음 해당 배열 값을 for-each 문으로 대입한다.

                           ( asList() 메서드는 정적인 리스트를 만들기 때문에 remove() 가 안된다 )

                    ☞   Collections.min() 메서드를 이용해 최소값을 찾는다.

                    ☞   찾은 최소값을 ArrayList.remove() 메서드로 삭제한다.

                    ☞   완성된 ArrayList 의 값들을 for 문을 통해 새롭게 만든 배열에 대입한다. 

                           ( toArray() 메서드로 배열로 만드려고 했지만, 제네릭이 이미 Integer이라서 int 형 배열론 못 만든다 )

 

-  반환 타입이 int[] 이다. 따라서 배열의 길이가 1일 때 단순히 -1 을 반환하는 것이 안된다. 배열의 첫 번째 요소에 -1 을 대입시킨 후 해당 배열을 반환해야 한다. 꼼꼼히 보자.