DEV

LeetCode #2724쉬움

2724. 정렬 기준

2724. Sort By

Sorting
해설 읽기 3
typescript

문제 설명

문제 설명: 배열 arr과 함수 fn이 주어졌을 때, 정렬된 배열 sortedArr을 반환하세요. 함수 fn은 숫자를 반환하는 것으로 가정하며, 이 숫자는 sortedArr의 정렬 순서를 결정합니다. sortedArr은 fn의 출력값을 기준으로 오름차순 정렬되어야 합니다. 함수 fn이 주어진 배열에 대해 중복된 숫자를 반환하지 않는다고 가정할 수 있습니다.

예제

예제 1

입력: arr = [5, 4, 1, 2, 3], fn = (x) => x
출력: [1, 2, 3, 4, 5]
설명: fn은 전달된 숫자를 그대로 반환하므로 배열은 오름차순으로 정렬됩니다.

예제 2

입력: arr = [{"x": 1}, {"x": 0}, {"x": -1}], fn = (d) => d.x
출력: [{"x": -1}, {"x": 0}, {"x": 1}]
설명: fn은 "x" 키에 대한 값을 반환합니다. 따라서 배열은 해당 값에 따라 정렬됩니다.

예제 3

입력: arr = [[3, 4], [5, 2], [10, 1]], fn = (x) => x[1]
출력: [[10, 1], [5, 2], [3, 4]]
설명: 배열은 인덱스=1 위치의 숫자에 따라 오름차순으로 정렬됩니다. 

예제 4

입력: arr = [5, 4, 1, 2, 3], fn = (x) => x
출력: [1, 2, 3, 4, 5]
설명: fn은 전달된 숫자를 그대로 반환하므로 배열은 오름차순으로 정렬됩니다.

예제 5

입력: arr = [{"x": 1}, {"x": 0}, {"x": -1}], fn = (d) => d.x
출력: [{"x": -1}, {"x": 0}, {"x": 1}]
설명: fn은 "x" 키에 대한 값을 반환합니다. 따라서 배열은 해당 값에 따라 정렬됩니다.

예제 6

입력: arr = [[3, 4], [5, 2], [10, 1]], fn = (x) => x[1]
출력: [[10, 1], [5, 2], [3, 4]]
설명: 배열은 인덱스=1 위치의 숫자에 따라 오름차순으로 정렬됩니다. 

⚠️제약 조건

  • 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을 인자로 받아, arrfn의 결과에 따라 정렬하여 반환합니다.

3. 각 단계별 동작 과정

  1. sortBy 함수 호출: arrfn을 인자로 받아 sortBy 함수를 호출합니다.
  2. sort 메서드 사용: arr.sort((a, b) => fn(a) - fn(b))는 배열의 요소 ab에 대해 fn을 적용하여 반환된 값을 비교합니다.
  3. 비교 함수: fn(a) - fn(b)ab보다 작으면 음수를, 크면 양수를, 같으면 0을 반환하여 sort 메서드가 올바른 순서로 요소를 정렬할 수 있도록 합니다.
  4. 정렬된 배열 반환: 정렬된 배열 sortedArr를 반환합니다.

4. 핵심 변수들의 역할

  • arr: 정렬할 배열입니다.
  • fn: 배열의 각 요소에 대해 정렬 기준이 되는 숫자를 반환하는 함수입니다.
  • ab: 배열의 요소로, sort 메서드에서 비교 대상이 됩니다.

5. 왜 이 방법이 효과적인지

이 방법은 JavaScript의 내장 sort 메서드를 사용하여 효율적으로 배열을 정렬합니다. sort 메서드는 최적화된 알고리즘을 사용하여 일반적으로 O(n log n)의 시간 복잡도로 배열을 정렬합니다. 또한, fn을 사용하여 유연하게 정렬 기준을 설정할 수 있어 다양한 데이터 구조와 요구사항에 맞게 적용할 수 있습니다.

이러한 점에서 이 방법은 간결하면서도 강력한 정렬 솔루션을 제공합니다.

관련 문제