(알고리즘) 문자열 내 마음대로 정렬하기

호두파파·2021년 5월 10일
0

알고리즘 연습

목록 보기
12/60


Q. 인덱스 n의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열을 앞쪽에 위치시키기

우선 JavaScirpt에서의 sort()함수는 기본적으로 원소들을 문자열로 만든 뒤에, UTF-16 코드 유닛값을 기준으로 순서를 정렬한다. 다시 말해 문자열로 바꾼 뒤에 정렬을 하기 때문에 숫자 정렬에 적합하지 않다.

숫자 정렬에 적합하지 않냐는 말은 n번쨰 글자를 기준으로 정렬하기 때문에 n번째 문자의 ASCII코드로 비교를 하기 때문이다.

function solution(strings, n) {
  return strings.sort((a,b) => a.charCodeAt(n) - b.charCodeAt(n));
}

위 코드는 사전 순으로 앞선 문자열이 앞쪽에 위치한다.는 조건을 충족하지 못한다.

sort([callback])는 callback에 인자로 firstEl과 secondEl이 들어오며, 연산의 결과가 -1일 때만 변경이 일어난다.

조건을 추가해, localeCompare함수를 사용해 문자열끼리 비교해 처리해주자.

localeCompare함수는 기준 문자열과 비교했을 때 비교 대상 문자열이 정렬상 전에 오는지, 후에 오는지 혹은 같은 순서에 배치되는지를 알려주는 숫자를 리턴하는 함수이다.

function solution(strings, n) {
  return strings.sort((a,b) => {
    let first = a.charCodeAt(n);
    let second = b.charCodeAt(n);
    
    if(first === second) {
      return a.localeCompare(b);
    } else {
      return first - second;
    });
  }

시간 복잡도를 고려해서 조금 더 가다듬어 주면,

function solution(string, n) {
  return strings.sort((a,b) => {
    const first = a[n];
    const second = b[n];
    
    if(first === second) {
      return (a > b) - ( a < b);
    } else {
      return (first > second) - (first < second)
    });
  }

이렇게 비교를 먼저해서 나온 boolean을 연산해 정렬할 수 있다. (true = 1, false = 0)

function solution(strings, n) {
 return strings.sort().sort((a,b) => a.charCodeAt(n) - b.charCodeAt(n));
profile
안녕하세요 주니어 프론트엔드 개발자 양윤성입니다.

0개의 댓글