두 개의 배열이 있다고 가정해 보겠습니다. 각각 arr1과 arr2라고 부르겠습니다. 여기서 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));
코드 설명
- 먼저 빈
Map을 생성하고,arr2의 길이를 변수len에 저장합니다. forEach메서드로arr2를 순회하면서 각 요소를 '요소 값 → 인덱스' 형태로 Map에 저장합니다.sort메서드의 비교 함수 내부에서 각 요소a,b에 대해 Map에 해당 값이 있으면 그 인덱스를, 없으면len + 값을 정렬 키로 사용합니다.- 두 키의 차이를 반환하여 최종 정렬 순서를 결정합니다.
이 방식 덕분에 arr2에 포함된 요소들은 arr2의 순서 그대로 앞쪽에 배치되고, 나머지 요소들은 자동으로 오름차순 정렬되어 뒤쪽에 위치하게 됩니다.
출력 결과
콘솔에 출력되는 결과는 다음과 같습니다 −
[
2, 2, 2, 1, 4,
3, 3, 9, 6, 7,
19
]