[Javascript] 커스텀 함수로 배열 정렬하기

Contents
사진: Unsplash의 Julia Taubitz
함수 및 개념 정리
arr.indexOf(searchElement, fromIndex)
- arr 배열에서 첫번째로 등장한 searchElement의 index를 반환한다.
- searchElement를 찾을 수 없다면 -1 을 반환한다.
- fromIndex부터 찾는다.
- 출처 : Array.prototype.indexOf()
const array = [2, 9, 9];
array.indexOf(2); // 0
array.indexOf(7); // -1
array.indexOf(9, 2); // 2
array.indexOf(2, -1); // -1
array.indexOf(2, -3); // 0
const array = [NaN]; // NaN은 검색할 수 없다.
array.indexOf(NaN); // -1
arr.includes(searchElement, fromIndex)
- arr 배열에서 searchElement가 포함되어 있는지를 반환한다.
- true 혹은 false 를 반환
- fromIndex부터 찾는다.
- 출처: Array.prototype.includes()
[1, 2, 3].includes(2); // true
[1, 2, 3].includes(4); // false
[1, 2, 3].includes(3, 3); // false
[1, 2, 3].includes(3, -1); // true
[1, 2, NaN].includes(NaN); // true (NaN 검색 가능)
['1', '2', '3'].includes(3); // false
['a', 'b', 'c'].includes('c', 3); // false
['a', 'b', 'c'].includes('c', 100); // false
.sort 의 시간 및 공간 복잡도
sort 함수는 배열의 길이에 따라서 시간과 복잡공간도가 변한다.
배열의 길이 <= 10
:- insertion sort를 사용한다.
- 시간복잡도:
O(n^2)
, 공간복잡도:O(1)
배열의 길이 > 10
:- quicksort를 사용한다.
- 시간복잡도:
O(n log n)
, 공간복잡도:O(log n)
array.sort(customFunction)
array.sort() 하면 inplace으로 정렬이 됩니다.
여기서 inplace란 array 배열 안에서 정렬이 된다는 뜻입니다.
sort()를 실행했을때 결과를 다른 변수에 할당하지 않고 정렬된 결과 값이 해당 배열에 적용됩니다.
ex)
arr = [5, 2, 1, 4, 3, 6];
arr.sort();
console.log(arr); // [1,2,3,4,5,6]
하지만 .sort() 만으로는 충분하지 않습니다. 왜냐하면 다음과 같은 상황이 있기 때문입니다.
- 내림차순으로 정렬하고 싶을때
- 다른 정렬 방법을 사용하고 싶을때
[5,12,1,2].sort()
의 결과 값은[1,12,2,5]
이다.
따라서 어떤 방법으로 정렬할지 .sort(정렬함수)
이렇게 함수를 .sort 으로 넘겨줄 수 있습니다.
`
커스텀함수
위에서의 정렬함수
함수는 다음과 같이 생겼습니다.
const customFunction = (a, b) => {
return 결과값;
};
여기에서 정렬되는 규칙은 다음과 같습니다.
결과값 < 0
: a 가 b 보다 낮은 index으로 배정된다.결과값 > 0
: b 가 a 보다 낮은 index으로 배정된다.결과값 == 0
: a 와 b 의 순서를 그대로 둔다.
다음으로는 몇가지 예시를 살펴보면서 커스텀함수를 작성 해보겠습니다.
// 오름차순으로 정렬(ascending order)
const ascendingOrder = (a, b) => {
if (a < b) {
// a가 더 작을때,
return -1; // a를 더 낮은 index으로 배정합니다.
} else if (a > b) {
// b가 더 작을때,
return 1; // b를 더 낮은 index으로 배정합니다.
} else {
return 0; // 둘이 같을때는 그냥 그대로
}
};
// 내림차순(descending order)
const descendingOrder = (a, b) => {
if (a > b) {
// a가 더 클때,
return -1; // a를 더 낮은 index으로 배정합니다.
} else if (a < b) {
// b가 더 클때,
return 1; // b를 더 낮은 index으로 배정합니다.
} else {
return 0; // 둘이 같을때는 그대로
}
};
// 배열 혹은 string 길이 순으로 정렬
const lengthOrder = (a, b) => {
if (a.length < b.length) {
// a길이가 더 작다면
return -1; // a를 더 낮은 index으로 배정합니다.
} else if (a.length > b.length) {
// b길이가 더 작다면
return 1; // b를 더 낮은 index으로 배정합니다.
} else {
return ascendingOrder(a, b);
}
};
const arr = [11, 43, 5, 4, 3, 2, 1];
arr.sort(); // [1, 11, 2, 3, 4, 43, 5]
arr.sort(ascendingOrder); // [1, 2, 3, 4, 5, 11, 43]
arr.sort(descendingOrder); // [43, 11, 5, 4, 3, 2, 1]
const arr2 = ['f', 'e', 'd', 'hello', 'andy'];
arr2.sort(); // ['andy', 'd', 'e', 'f', 'hello']
arr2.sort(lengthOrder); // ['d', 'e', 'f', 'hello', 'andy']
if문
을 사용하지 않고 조금 더 간단하게 -
표현하면 다음과 같습니다.
// 오름차순으로 정렬(ascending order)
const ascendingOrder = (a, b) => {
return a - b; // a가 더 작을때 음수(a를 더 작은 index 에 배정)
};
// 내림차순(descending order)
const descendingOrder = (a, b) => {
return b - a; // b가 더 작을때 음수(b를 더 작은 index에 배정)
};
// 배열 혹은 string 길이 순으로 정렬
const lengthOrder = (a, b) => {
if (a.length == b.length) {
return ascendingOrder(a, b);
} else {
// a의 길이가 더 작을때 음수(a를 더 작은 index에 배정)
return a.length - b.length;
}
};
const arr = [11, 43, 5, 4, 3, 2, 1];
arr.sort(); // [1, 11, 2, 3, 4, 43, 5]
arr.sort(ascendingOrder); // [1, 2, 3, 4, 5, 11, 43]
arr.sort(descendingOrder); // [43, 11, 5, 4, 3, 2, 1]
const arr2 = ['f', 'e', 'd', 'hello', 'andy'];
arr2.sort(); // ['andy', 'd', 'e', 'f', 'hello']
arr2.sort(lengthOrder); // ['d', 'e', 'f', 'hello', 'andy']
순서가 정해져 있을때
이미 순서가 정해진 배열 sortedArray
가 있을때 새로운 배열을 이 순서에 따라서 정렬하려면 어떻게 해야 할까요?
sortedArray
에 없는 요소라면, 등장한 순서대로 정렬
sortedArray = ['j', 'o', 'o', 'h', 'w', 'a', 'n'];
inputArray = ['o', 'n', 'o', 'y', 'w', 'j', 'h', 'a', 'g'];
// inputArray를 ['j','o','o','h','w','a','n','w','g'] 으로 정렬 해야합니다.
const comparator = (a, b) => {
let indexOfA = sortedArray.length; // a의 index를 반환
let indexOfB = sortedArray.length; // 존재하지 않는다면 -1 반환
if (sortedArray.includes(a)) {
indexOfA = sortedArray.indexOf(a);
}
if (sortedArray.includes(b)) {
indexOfB = sortedArray.indexOf(b);
}
return indexOfA - indexOfB;
};
inputArray.sort(comparator); // ['j','o','o','h','w','a','n','w','g']