[Javascript] sort()에 여러 기준을 연달아 적용해야 할 때

박기영·2022년 11월 2일
1

Javascript

목록 보기
18/45

알고리즘 문제를 풀다보면, 프로젝트를 하다보면 여러 기준으로 정렬을 구현해야할 때가 있다.
여기서 여러 기준이란 다음과 같다.
"점수 순으로 정렬하되, 점수가 같으면 이름 순으로 정렬해라."
이런 정렬을 구현하려면 어떻게 해야할까?

예시 상황

let score = {
  zib: 100,
  ahn: 100,
  baker: 200,
  echo: 120,
  yaho: 300,
};

이름과 점수가 표시되어있는 object가 있다.
이들을 점수 순으로 정렬하되, 점수가 같으면 이름 순으로 정렬할 것이다.

이런 형태의 object(key가 일정한 규칙이 없을 때)를 정렬할 때,
필자는 2차원 배열로 변환하여 사용한다.

let ans = [];

for (let key in score) {
  ans.push([key, score[key]]);
}

이 방법을 통해 얻게 되는 2차원 배열은 아래와 같다.

[
  [ 'zib', 100 ],
  [ 'ahn', 100 ],
  [ 'baker', 200 ],
  [ 'echo', 120 ],
  [ 'yaho', 300 ]
]

이제 정렬을 시도해보자.

시도 1. 두 개의 sort()를 만들어 적용

// 점수 순
ans.sort((a, b) => {
  if (a[1] > b[1]) {
    return -1;
  }
  if (a[1] < b[1]) {
    return 1;
  }
  if (a[1] === b[1]) {
    return 0;
  }
});

console.log(ans);

// 이름 순
ans.sort((a, b) => {
  if (a[0] < b[0]) {
    return -1;
  }
  if (a[0] > b[0]) {
    return 1;
  }
  if (a[1] === b[1]) {
    return 0;
  }
});

console.log(ans);

코드는 위에서부터 아래로 흐른다.
따라서 점수 순으로 정렬하고, 정렬된 배열을 다시 이름 순으로 정렬한다.
정렬 상황을 확인하기 위해 콘솔을 찍어놨으므로, 확인해보자.

// 점수 순
[
  [ 'yaho', 300 ],
  [ 'baker', 200 ],
  [ 'echo', 120 ],
  [ 'zib', 100 ],
  [ 'ahn', 100 ]
]

// 이름 순
[
  [ 'ahn', 100 ],
  [ 'baker', 200 ],
  [ 'echo', 120 ],
  [ 'yaho', 300 ],
  [ 'zib', 100 ]
]

점수 순으로 정렬하는 것까지는 잘됐다.
그러나, 이름 순 정렬을 실행하니 점수 + 이름의 과정으로 정렬이 된게 아니라
점수, 이름. 즉, 별개의 과정으로 정렬이 실행되었다.

따라서 이 방법은 연속되는 조건에 따라 정렬하기에는 맞지 않는 방법이다.

시도 2. 하나의 sort()에 두 개의 조건을 적용

두 개의 sort()를 연속으로 사용하는 것은 의미가 없다는 것을 알았다.
이번에 시도할 것은 sort() 내에서 여러번의 조건을 작성해놓는 것이다.

ans.sort((a, b) => {
  // 점수 순
  if (a[1] > b[1]) {
    return -1;
  }
  if (a[1] < b[1]) {
    return 1;
  }
  
  // 점수 순 정렬 직후 이름 순 정렬
  if (a[0] < b[0]) {
    return -1;
  }
  if (a[0] > b[0]) {
    return 1;
  }
});

console.log(ans);

결과를 확인해보자.

[
  [ 'yaho', 300 ],
  [ 'baker', 200 ],
  [ 'echo', 120 ],
  [ 'ahn', 100 ],
  [ 'zib', 100 ]
]

우선 점수 순으로 정렬은 확실히 된 것으로 확인된다.
그렇다면 이름 순은 잘 적용되었을까?
동점이었던 ahnzib이 이름 순으로 정렬이 된 것을 확인 할 수 있다.

사실, 개인 프로젝트를 진행해오면서 정렬 기준을 연달아 적용할 일은 없었다.
하나의 기준으로 정렬하는 것이라면 모를까..
다만, 알고리즘 문제에 가끔씩 등장하기도 하기 때문에 방법은 알아둬야겠다.

참고 자료

jazzyfact95님 블로그

profile
나를 믿는 사람들을, 실망시키지 않도록

0개의 댓글