문제
정수를 저장한 배열, 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 을 대입시킨 후 해당 배열을 반환해야 한다. 꼼꼼히 보자.
'코딩 테스트' 카테고리의 다른 글
[프로그래머스] (Lv.1) 정수 내림차순으로 배치하기 (0) | 2022.08.31 |
---|---|
[프로그래머스] (Lv.1) 정수 제곱근 판별 (0) | 2022.08.31 |
[프로그래머스] (Lv.1) 짝수와 홀수 (0) | 2022.08.30 |
[프로그래머스] (Lv.1) 최대공약수와 최소공배수** (0) | 2022.08.30 |
[프로그래머스] (Lv.1) 콜라츠 추측 (0) | 2022.08.30 |