문자열 내 마음대로 정렬하기 (feat. JS sort 함수)

2023. 9. 5. 09:44· algorithm

https://school.programmers.co.kr/learn/courses/30/lessons/12915

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

이 문제의 핵심은 `sort 함수`의 활용이라고 생각한다.

 

sort 함수의 기본 정렬 순서는 `유니코드 코드 포인트의 순서`를 따른다. 배열의 요소가 숫자 타입이라 할지라도 배열의 요소를 일시적으로 문자열로 변환한 후 유니코드 코드 포인트의 순서를 기준으로 정렬한다.

예를 들어, 문자열 '1'의 유니코드 코드 포인트는 U+0031, 문자열 '2'의 유니코드 포인트는 U+0032다. 이처럼 문자열 '1'의 유니코드 포인트 순서가 문자열 '2'의 유니코드 코드 포인트 순서보다 앞서므로 문자열 배열 ['2'. '1']을 sort 함수로 정렬하면 ['1', '2']로 정렬된다.

 

즉, js의 sort함수는 원소들을 문자열로 바꾼 뒤에 정렬을 하기 때문에 숫자 정렬에 적합하지 않다. 이러한 sort 함수의 특징 때문에 우리는 sort 함수를 커스터마이징해야한다.

arr.sort([compareFunction])에서 `[compareFunction]` 부분을 정의해야한다.

[compareFunction]을 작성할 때는 어떤 값을 반환하는지가 중요하다.
`숫자 값`을 반환해야 하는데, `0을 기준`으로 `3가지` 케이스로 나뉜다.

  • 0보다 크다 / 0이다 / 0보다 작다

  • 매개변수로 [a, b]를 받았고 반환 값이 0보다 큰 경우 :
    그대로 [a, b]. a가 먼저온다.
  • 매개변수로 [a, b]를 받았고 반환 값이 0인 경우 :
    그대로 [a, b]. a와 b의 위치를 그대로 둔다.
  • 매개변수로 [a, b]를 받았고 반환 값이 0보다 작은 경우 :
    b가 먼저 온다. [b, a]가 된다.

즉, 변경은 -1에서만 일어난다.


sort((a, b) => b - a)에서 a와 b가 헷갈릴 수 있다.  [1, 2, 3]이라는 배열이 있을 때, 첫 루프로 a에 2가 들어오고 b에 1이 들어온다. 즉, a, b의 알파벳 순서와는 반대로 들어온다. 이게 헷갈린다면 sort((next, prev) => prev - next)로 사용할 수 있다.

 

 

내 작성 코드

이해가 쉽도록 sort 함수의 매개변수로 a,b 대신 next,prev로 작성했다.

 

각 문자열의 n번째 글자를 기준으로 오름차순 정렬한다.
n번째 글자가 동일하다면, 전체 문자열을 사전 순으로 비교하여 오름차순 정렬한다.

function solution(strings, n) {
    strings.sort((next,prev)=>{
        if(next[n] > prev[n]) return 1;
        if(prev[n] > next[n]) return -1;

        if(next > prev) return 1;
        if(prev > next) return -1;

        return 0;
    });
    return strings;
}

 

참고자료

- 자바스크립트 딥다이브의 sort 함수 부분

- https://velog.io/@jakeseo_me/Javascript-Sort%ED%95%A8%EC%88%98%EC%97%90-%EB%8C%80%ED%95%9C-%EC%9E%A1%EC%A7%80%EC%8B%9D

저작자표시 (새창열림)

'algorithm' 카테고리의 다른 글

스킬 트리  (0) 2023.09.27
구명보트  (0) 2023.09.25
JadenCase 문자열 만들기  (0) 2023.08.28
부분집합 구하기  (0) 2023.08.20
이진트리 순회 (깊이우선탐색)  (0) 2023.08.19
'algorithm' 카테고리의 다른 글
  • 스킬 트리
  • 구명보트
  • JadenCase 문자열 만들기
  • 부분집합 구하기
nana-log
nana-log
포스팅이 좋았다면 "❤️공감" 눌러주세요!
nana-log
nana-log
nana-log
전체
오늘
어제
  • 분류 전체보기 (104)
    • TIL (26)
    • project (7)
    • algorithm (18)
    • information processing (30)
    • etc (19)

인기 글

태그

  • docker
  • dev-tools
  • 회고
  • JS
  • 알고리즘
  • 자바스크립트
  • 원티드프리온보딩

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
nana-log
문자열 내 마음대로 정렬하기 (feat. JS sort 함수)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.