Array.prototype.sort()

hackney·2021년 6월 22일

Array.prototype.sort()

sort() 메소드는 배열의 요소를 적절한 위치에 정렬한 후 그 배열을 반환한다.
정렬은 stable sort가 아닐 수 있고 기본 정렬 순서는 문자열의 유니코드 코드 포인트를 따른다.

sort() 함수는 기본적으로 원소들을 문자열로 만든 후에, UTF-16 코드 유닛 값을 기준으로 순서를 정렬한다.
문자열로 바꾼 뒤에 정렬이 이루어지기 때문에 숫자 정렬에 적합하지 않아서 compare function 을 작성해준다.

UTF-16 코드 유닛 값 기준 array.sort( );

var arr = [1,30,4,21,100,1000];
var arr2 = arr.sort();
    arr2;
	// [1,100,1000,21,30,4];

Compare Function(비교함수작성)

arr.sort([compareFunction])
[Compare Function]은 콜백 함수로 두 개의 매개변수 (param1,param2) 를 가진다.

매개변수를 연산했을 때의 값은 1,0,-1 세 개중 하나이고 이를 이용해 오름차순 또는 내림차순으로 배열을 정렬할 수 있다.

var arr = [1,30,4,21,100,1000];
arr.sort((a,b) => b - a);

콜백함수가 어떤 값을 반환하는지를 잘 살펴보아야하는데 앞서 설명했듯이, 양수와 음수 그리고 0의 세 가지 케이스가 존재한다.

  • [compare function] 의 결과 값이 양수일 경우 그대로 [ a, b ]
  • [compareFunction] 의 결과 값이 음수일 경우 순서 변동 [ b, a ]
  • [compareFunction] = 0 경우 그대로 [ a, b ]

문자열이나 숫자를 비교할 때 결과값으로 -1,0,1을 리턴하도록 해서 정렬하는데에 활용하는 원리!


프로그래머스 - 문자열 내 마음대로 정렬하기

sort( )함수의 원리도 모르고 ;; 냅다 for문부터 질러버리고 작성했던 첫 풀이와 이후의 풀이에서도 for문 안에 sort함수를 작성했는데 매개변수로 받는 a,b가 배열 내의 값이고 이를 비교해서 -1일 때 앞으로 보내주는 원리로 작성하면 되는 것이기 때문에 ... for를 이용해.. index를 돌릴 필요가 없다... 😅 (민망)

💡 나의 풀이

function solution(strings, n) {
    var answer = strings.sort((a,b) => {
    	
      	var str = a[n];
     	var str2 = b[n];

    	if (str < str2) {
       		return -1;
    	}
    	if (str > str2) {
        	return 1;
    	}
    	if (str === str2){
        // a[n]과 b[n]이 같을 때는 a와 b의 문자열을 비교해준다
        	if(a > b) return 1;
        	if(a < b) return -1;
        	return 0;
    	}
        return 0;
    	});
    	
  	return answer;
}

다른 사람의 풀이 중 사용해보려다가 못했던 localeCompare 를 활용해 아주 간단하게 작성한 코드를 첨부한다.

function solution(strings, n) {
    // strings 배열
    // n 번째 문자열 비교
    return strings.sort((s1, s2) => s1[n] === s2[n] ? s1.localeCompare(s2) : s1[n].localeCompare(s2[n]));
}

localeCompare를 사용하려고 시도했을 때 ... 이제와서 생각해보니 그냥 전체 문자열을 통으로 비교해주면 되는 것이었는데... 나는 a[n]+1, b[n]+1을 안에 집어넣고 ;;; 쌩쇼를 했다...

그래서 정리해보는 localeCompare( )!!!!


String.prototype.localCompare()

sort()와 함께 사용하는 예시

var items = ['réservé', 'premier', 'cliché', 'communiqué', 'café', 'adieu'];
items.sort((a, b) => a.localeCompare(b)); 
// ['adieu', 'café', 'cliché', 'communiqué', 'premier', 'réservé']
profile
우리 머릿속에 어떤 생각이 차지하고 있든 우주의 질서가 달라지지는 않는다

0개의 댓글