배열 정렬 sort

nais·2021년 12월 14일
0
post-thumbnail

sort 를 공부하게된 계기

과거에 풀어논 알고리즘을 복습 중에... 문자열 정렬 시에 만약 [a , Ab] 의 배열의 두 원소를 비교하는 것이라면 대문자를 먼저 정렬하는 문제였는데 이때도 모르고 쓴거 같습니다

?? 이게뭐람

냅다 구글링 한거 복사한 지난 날의 나를 반성하며 알고써야지 정렬 문제 풀 때마다 언제까지 검색만 할래 싶어서 이번 블로그 글 주제로 선정하였습니다!!

sort 메서드란?

배열이 제공하는 고차 함수로 배열 요소들의 순서를 바꾸는 메서드입니다

  • 기본적으로 오름차순으로 요소를 정렬 (내림차순으로 요소를 정렬하려면 sort 메서드를 사용 후 reverse() 적용하면 간단하다)

  • 문자열의 유니코드 코드 포인트 의 순서 기준

  • 사용 시 원 배열의 정렬이 바뀐다

sort의 비교방식

1)숫자 정렬

숫자 정렬은 sort() 를 사용하면 안된다?

배열의 원소가 숫자일 지라도 일시적으로 문자열로 변환한 후 정렬되는 모습을 확인했습니다

const nums = [5, 7, 2, 10];
nums.sort();
console.log(nums); // [ 10, 2, 5, 7 ]

👩‍🏫 해결방안

(1)sort 메서드에 정렬 순서를 정의하는 비교 함수를 인자로 전달

(2) 비교 함수는 양수/ 음수 / 0을 반환

  • 0 보다 작으면 비교함수의 첫번째 인수(num1)를 우선 정렬,
  • 0보다 크면 두번째 인수(num2)를 우선 정렬
  • 0 이면 정렬하지않음

비교 함수의 반환 값 이 0보다 작으면 num1 을 우선으로 정렬

const nums = [5, 7, 2, 10];
nums.sort((num1, num2) => num1 - num2); // 산술 연산자를 이용 
console.log(nums);// [ 2, 5, 7, 10 ]

2)정렬하는 데이터 타입을 모를경우

사실 우리가 직접 프로그래밍을 진행하면 정렬 시 데이터 타입을 다 인지할 수 없고 대부분 객체 타입을 사용할 것입니다

그럴때는 어떻게 정렬하는지 실습을 통해서 알아보았습니다!!

📌 학생 객체를 각각 입력 받은 프로퍼티 키로 출력해보자



const students = [
  { id: 3, name: 'sian', register: true },
  { id: 2, name: 'minzy', register: false },
  { id: 1, name: 'hanna', register: false },
];

const sortStudy = (students, key) =>
  [...students].sort((student1, student2) =>
    student1[key] > student2[key] ? 1 : student1[key] < student2[key] ? -1 : 0
  ); 

console.log(sortStudy(students, 'id'));
console.log(sortStudy(students, 'name'));
console.log(sortStudy(students, 'register'));

결과

[
  { id: 1, name: 'hanna', register: false },
  { id: 2, name: 'minzy', register: false },
  { id: 3, name: 'sian', register: true }
]
[
  { id: 1, name: 'hanna', register: false },
  { id: 2, name: 'minzy', register: false },
  { id: 3, name: 'sian', register: true }
]
[
  { id: 2, name: 'minzy', register: false },
  { id: 1, name: 'hanna', register: false },
  { id: 3, name: 'sian', register: true }
]

👩‍🏫 해결방안

프로퍼티 값이 문자열인경우 숫자처럼 산술 연산자를 쓴다면 NaN 가 나올것이다 ===> 비교 연산자 사용

  • 아스키코드 값 비교시 첫번째 인수가 두번째 인수보다 크다면? 그렇다면 첫번째 인수로 뒤로 간다 (-1 처리)

  • 두번째 인수가 첫번째 인수보다 크다면 변동 없다 (1로 처리)

  • 두 인수의 아스키코드 값이 같다면 0으로 처리
    (두 인수가 swap 이 일어나지 않도록 처리 해주는 것이다 !! 같은게 swap 일어나면 어때서 라고 생각했지만 바뀌게 하지않고 , 명시적 처리를 해주는것이 훨씬 인지가 잘된다)

📌 boolean 타입 또한 ("false", "true") 문자열 처리가 되어서 아스키 코드를 비교하기 때문에 false 이 먼저 올것이다

👩‍💻
[...students] 로 스프레드 문법 처리 해준 이유는 sort 는 원본을 변경하는 메서드이기 때문에 사본을 만들어서 변경 후 그 값을 화살표 함수의 return 값으로 넘겨주었습니다

결론

앞으로 알고리즘 혹은 어플리케이션을 개발할 때도 정렬은 매우 중요하게 작용할 것입니다

제가 데이터 타입을 알고 처리하는 경우도 거의 없겠죠... 그렇기 때문에 모든 데이터가 처리될수 있는 소스코드를 짜는 것을 차차 익혀나갈 것을 목표로 공부중입니다

Reference

모던자바스크립트 - 배열 고차 함수

MDN-Array.prototype.sort()

profile
왜가 디폴트값인 프론트엔드 개발자

0개의 댓글