문제 설명
문제 설명: 배열 arr과 함수 fn이 주어졌을 때, 정렬된 배열 sortedArr을 반환하세요. 함수 fn은 숫자를 반환하는 것으로 가정하며, 이 숫자는 sortedArr의 정렬 순서를 결정합니다. sortedArr은 fn의 출력값을 기준으로 오름차순 정렬되어야 합니다. 함수 fn이 주어진 배열에 대해 중복된 숫자를 반환하지 않는다고 가정할 수 있습니다.
예제
예제 1
예제 2
예제 3
예제 4
예제 5
예제 6
⚠️제약 조건
- •
arr는 유효한 JSON 배열입니다 - •
fn은 숫자를 반환하는 함수입니다 - •
1 <= arr.length <= 5 * 105
해결 방법
🎯접근 방식
이 문제는 JavaScript의 내장 함수 sort를 사용하여 해결할 수 있습니다. 주어진 함수 fn을 통해 각 요소의 정렬 기준 값을 얻고, 이 값을 사용하여 배열을 오름차순으로 정렬합니다. 핵심 아이디어는 fn이 반환하는 값을 기준으로 sort 함수의 비교 함수를 정의하여 배열을 정렬하는 것입니다.
솔루션 코드
복잡도 분석
O(n log n)O(n)💡상세 설명
이 문제는 주어진 배열 arr와 함수 fn을 사용하여 배열을 정렬하는 문제입니다. 이때 fn 함수는 배열의 각 요소에 대해 숫자를 반환하며, 이 숫자를 기준으로 배열을 오름차순으로 정렬합니다. fn이 반환하는 값은 중복되지 않는다고 가정합니다.
1. 알고리즘의 핵심 아이디어
이 문제의 핵심은 배열의 각 요소에 대해 fn 함수를 적용하여 얻은 값을 기준으로 배열을 정렬하는 것입니다. JavaScript의 Array.prototype.sort() 메서드를 사용하여 정렬을 수행할 수 있습니다. 이 메서드는 두 요소를 비교하는 함수(여기서는 fn의 결과를 사용)를 인자로 받아, 이를 통해 배열을 정렬합니다.
2. 코드의 주요 로직 설명
type JSONValue = null | boolean | number | string | JSONValue[] | { [key: string]: JSONValue };
type Fn = (value: JSONValue) => number;
function sortBy(arr: JSONValue[], fn: Fn): JSONValue[] {
return arr.sort((a, b) => fn(a) - fn(b));
}
JSONValue타입: 이 타입은 배열의 요소가 될 수 있는 다양한 데이터 타입을 정의합니다.null,boolean,number,string, 배열, 객체 등이 포함됩니다.Fn타입: 이 타입은 배열의 각 요소에 대해 숫자를 반환하는 함수 타입을 정의합니다.sortBy함수: 이 함수는 배열arr와 함수fn을 인자로 받아,arr를fn의 결과에 따라 정렬하여 반환합니다.
3. 각 단계별 동작 과정
sortBy함수 호출:arr와fn을 인자로 받아sortBy함수를 호출합니다.sort메서드 사용:arr.sort((a, b) => fn(a) - fn(b))는 배열의 요소a와b에 대해fn을 적용하여 반환된 값을 비교합니다.- 비교 함수:
fn(a) - fn(b)는a가b보다 작으면 음수를, 크면 양수를, 같으면 0을 반환하여sort메서드가 올바른 순서로 요소를 정렬할 수 있도록 합니다. - 정렬된 배열 반환: 정렬된 배열
sortedArr를 반환합니다.
4. 핵심 변수들의 역할
arr: 정렬할 배열입니다.fn: 배열의 각 요소에 대해 정렬 기준이 되는 숫자를 반환하는 함수입니다.a와b: 배열의 요소로,sort메서드에서 비교 대상이 됩니다.
5. 왜 이 방법이 효과적인지
이 방법은 JavaScript의 내장 sort 메서드를 사용하여 효율적으로 배열을 정렬합니다. sort 메서드는 최적화된 알고리즘을 사용하여 일반적으로 O(n log n)의 시간 복잡도로 배열을 정렬합니다. 또한, fn을 사용하여 유연하게 정렬 기준을 설정할 수 있어 다양한 데이터 구조와 요구사항에 맞게 적용할 수 있습니다.
이러한 점에서 이 방법은 간결하면서도 강력한 정렬 솔루션을 제공합니다.