array sort 함수에 관한 고찰 (feat.작동원리)

이명진·2023년 2월 3일
1

TIL

목록 보기
10/16

알고리즘 문제를 풀면서 정렬에 관해서 문제가 많이 나온다.

정렬 함수인 sort 를 자주 활용하긴 했는데 어떤 방식인지 이해하지는 못하고 간단하게
a-b 는 오름차순 b-a는 내림차순 식으로만 사용해왔다.

그러던중 프로그래머스 특이한 정렬 문제에서 sort함수 심화 에 대해 풀고나서
제대로 이해를 해야 나중에 써먹을것 같아서 어떻게 작동되는지 파헤쳐 봤다.

공식문서도 살펴보고 직접 콘솔도 찍어보면서 작동원리에 대해서 이해할수 있었다.

sort함수 특징

sort함수의 특징은 이렇다.
정렬을 위해 사용되는데 기존 함수에 매개변수가 없이 사용이 가능하다.

매개변수가 없을 경우

매개 변수가 없을 경우 유니코드 코드 포인트의 순서로 문자열을 비교하여 정렬한다.
문자열 , 달력의 월 등은 잘 정렬이 되지만 숫자의 경우 유니코드가 달라서 정렬이 달라질수가 있다.

그때 사용하는 것이 매개변수 (a,b)를 주어서 내림차순, 오름차순 등으로 사용을 한다.

매개변수가 있을 경우

공식 문서의 설명

  • compareFunction(a, b)이 0보다 작은 경우 a를 b보다 낮은 색인으로 정렬합니다. 즉, a가 먼저옵니다.
  • compareFunction(a, b)이 0을 반환하면 a와 b를 서로에 대해 변경하지 않고 모든 다른 요소에 대해 정렬합니다. 참고 : ECMAscript 표준은 이러한 동작을 보장하지 않으므로 모든 브라우저(예 : Mozilla 버전은 적어도 2003 년 이후 버전 임)가 이를 존중하지는 않습니다.
  • compareFunction(a, b)이 0보다 큰 경우, b를 a보다 낮은 인덱스로 소트합니다.
  • compareFunction(a, b)은 요소 a와 b의 특정 쌍이 두 개의 인수로 주어질 때 항상 동일한 값을 반환해야합니다. 일치하지 않는 결과가 반환되면 정렬 순서는 정의되지 않습니다.

쉽게 이해가 가지 않아서 콘솔을 찍어 보면서 결과값을 확인하였다.
예시는 프로그래머스 문제의 특이한 정렬 문제의 예시이다.

function solution(numlist, n) {
  let answer = [];
   numlist.sort((a,b)=>{
     console.log(a,b)
     return a-b
     
   })
  
    return answer;
}
solution(	[10000, 20, 36, 47, 40, 6, 10, 7000], 30)
// 콘솔 값 
20 10000
36 20
36 10000
36 20
47 36
47 10000
40 47
40 36
6 40
6 36
6 20
10 40
10 20
10 6
7000 36
7000 47
7000 10000

이를 통해 확인을 해봤을 경우 (내가 생각한 작동원리)

정렬을 시작하게 되면 빈 배열을 한개 만든다.
그리고 첫번째 부터 정렬을 시작한다.

a, b 매개변수는 처음 시작할때 a는 인덱스 1 즉 두번째 자리 값이다.
b는 첫번째 자리 값이다.

//콘솔 첫번째 
20 10000

비교를 한뒤 20과 1000을 순서에 맞게 정렬한다.
만들어 두었던 배열에 20이 작으니 앞에 1000이 크니 뒤에 넣는다.

// 배열 [20,1000]

그 다음 값을 가져온다.
다음값을 계속 a에 넣어주며 비교를 하게 된다.
이후부터 기존의 배열 순서대로의 값들을 a에 넣어주고 새로만든 빈배열의 값에서 측정값을 b에 넣어주는것 같다.
즉 두번째 시도에서 a 값은 numlist의 값의 두번째 값 (1000,20은 비교했으니) 36이다.
36을 타깃으로 빈배열에서 작은 수인 20과 비교를 한다. 비교 보다 크니 다음 숫자인 1000과 비교한다.
비교했을때 1000보다 36이 작으니 20과 1000사이에 들어가는 걸로 배열에 넣어둔다. (20과 비교를 했는데 콘솔에서는 왜 다시 36과 20을 비교하는지 모르겠다)
그래서 배열에는 [20,36,1000]이 들어가게 된다.

그리고 그 다음값을 numlist에서 가져온다. 47이 a값으로 들어가고 빈배열에 방금 넣어둔값을 가져온다(36) 36과 먼저 비교를 하고 크니까 빈배열의 다음수인 1000과 비교를 해서 값을 또 정렬해둔다.

이런 식으로 새로운 배열을 만들고 비교 대조군을 하나씩 가져와서 정렬해두는것 같다.

이렇게 확인하니 이해가 가게 되었다.

새로운 빈배열을 만들어 두고 비교를 하는데 방금 정렬한 배열을 다시 꺼내와서 앞뒤와 비교를 하니 시간이 절약되는것 같다.

이런 방식으로 sort 함수의 작동방식에 대해 알수 있었다.
이를 심화로 더 생각을 해보면서 함수를 사용할수 있을것 같다.

수정이 필요하거나 추가될 사항이 있다면 계속 추가해보도록 하겠다.

profile
프론트엔드 개발자 초보에서 고수까지!

0개의 댓글