Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript로 구현하는 상대 정렬(Relative Sort) 완벽 가이드

두 개의 배열이 있다고 가정해 보겠습니다. 각각 arr1arr2라고 부르겠습니다. 여기서 arr2의 요소들은 서로 중복되지 않으며, arr2의 모든 요소는 arr1에도 포함되어 있습니다.

우리는 이러한 두 배열을 입력받아 arr1의 요소들을 정렬하는 JavaScript 함수를 작성해야 합니다. 정렬 조건은 다음과 같습니다.

  • arr1 내 요소들의 상대적 순서가 arr2와 동일해야 합니다.
  • arr2에 나타나지 않는 요소들은 arr1의 끝부분에 오름차순으로 배치해야 합니다.

예를 들어, 입력 배열이 다음과 같다면 −

const arr1 = [2,3,1,3,2,4,6,7,9,2,19];
const arr2 = [2,1,4,3,9,6];

기대하는 출력 결과는 다음과 같습니다 −

const output = [2,2,2,1,4,3,3,9,6,7,19];

접근 방법

이 문제를 해결하는 핵심 아이디어는 Map 객체를 활용하는 것입니다. 먼저 arr2의 각 요소와 해당 인덱스를 Map에 저장한 뒤, 커스텀 비교 함수를 사용해 arr1을 정렬합니다.

  • arr1의 요소가 Map에 존재하면 → 해당 요소의 arr2에서의 인덱스를 우선순위로 사용합니다.
  • arr1의 요소가 Map에 존재하지 않으면 → arr2의 길이에 요소 값을 더한 값을 우선순위로 사용하여, arr2에 포함된 요소들보다 뒤에 배치되도록 합니다.

예제 코드

const arr1 = [2,3,1,3,2,4,6,7,9,2,19];
const arr2 = [2,1,4,3,9,6];
const relativeSortArray = (arr1, arr2) => {
   const map = new Map();
   const len = arr2.length;
   arr2.forEach((a, i) => {
      map.set(a, i); });
      return arr1.sort((a, b) => {
         a = map.has(a) ? map.get(a) : len + a;
         b = map.has(b) ? map.get(b) : len + b; return a - b;
   });
};
console.log(relativeSortArray(arr1, arr2));

코드 설명

  1. 먼저 빈 Map을 생성하고, arr2의 길이를 변수 len에 저장합니다.
  2. forEach 메서드로 arr2를 순회하면서 각 요소를 '요소 값 → 인덱스' 형태로 Map에 저장합니다.
  3. sort 메서드의 비교 함수 내부에서 각 요소 a, b에 대해 Map에 해당 값이 있으면 그 인덱스를, 없으면 len + 값을 정렬 키로 사용합니다.
  4. 두 키의 차이를 반환하여 최종 정렬 순서를 결정합니다.

이 방식 덕분에 arr2에 포함된 요소들은 arr2의 순서 그대로 앞쪽에 배치되고, 나머지 요소들은 자동으로 오름차순 정렬되어 뒤쪽에 위치하게 됩니다.

출력 결과

콘솔에 출력되는 결과는 다음과 같습니다 −

[
   2, 2, 2, 1, 4,
   3, 3, 9, 6, 7,
   19
]