문제 상황
숫자 배열을 첫 번째 인수로, 정수 n을 두 번째 인수로 받는 자바스크립트 함수를 작성해야 합니다. 이 함수는 배열에서 가장 큰 값 n개를 골라내어, 해당 숫자들만으로 구성된 새로운 배열을 반환해야 합니다.
구현 방법
가장 간단하고 직관적인 접근 방식은 다음과 같습니다.
- 원본 배열이 변경되지 않도록
slice()로 복사본을 만듭니다. - 복사본을 내림차순으로 정렬합니다.
- 정렬된 배열의 앞부분에서 n개의 요소를 잘라내어 반환합니다.
예제 코드
이를 구현한 코드는 다음과 같습니다.
const arr = [3, 4, 12, 1, 0, 5, 22, 20, 18, 30, 52];
const pickGreatest = (arr = [], num = 1) => {
if(num > arr.length){
return [];
}
const sorter = (a, b) => b - a;
const descendingCopy = arr.slice().sort(sorter);
return descendingCopy.splice(0, num);
};
console.log(pickGreatest(arr, 3));
console.log(pickGreatest(arr, 4));
console.log(pickGreatest(arr, 5));
실행 결과
콘솔에 출력되는 결과는 다음과 같습니다.
[ 52, 30, 22 ]
[ 52, 30, 22, 20 ]
[ 52, 30, 22, 20, 18 ]
코드 설명
- 유효성 검사: 요청한 개수(n)가 배열 길이보다 크면 빈 배열을 반환하여 오류를 방지합니다.
- sorter 함수:
b - a를 반환하도록 작성하여 배열을 내림차순으로 정렬합니다. - slice(): 원본 배열의 복사본을 생성하므로, 정렬 과정에서 원본 데이터가 변경되지 않습니다.
- splice(0, num): 내림차순으로 정렬된 배열의 처음 n개 요소, 즉 가장 큰 값들을 추출하여 새 배열로 반환합니다.