본문 바로가기
Algorithm/Programmers

[Programmers] 문자열 내 마음대로 정렬하기(JavaScript)

by 백승전 2022. 7. 24.

 

알림

 

본 포스팅은 공부 목적으로 작성된 글이며 상업적 목적으로 절대 사용되지 않았음을 밝힙니다.

 

문제

 

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

 

프로그래머스

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

programmers.co.kr

 

문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.

 

코드

 

function solution(strings, n) {
    return strings.sort((a, b)=>{
        if(a[n] > b[n]) return 1;
        if(a[n] < b[n]) return -1;
        if(a[n] == b[n]) return a > b ? 1 : -1;
    })
}

 

 

풀이

 

오름차순으로 정렬을 하는 만큼 sort() 함수를 사용해야 하는데요. 이번 문제를 통해 sort() 함수에 대해 많은 공부가 되었습니다.

 

우선 문자열을 자르고 n번째 자리의 문자를 비교하고 다시 합치고 등의 작업은 매우 복잡하다고 생각이 되었고, sort() 함수 안에서 그냥 바로 문자열의 n번째 자리를 비교하고 오름차순으로 정렬하여 리턴하면 됐습니다.

 

때문에 이 문제를 풀기 위해선 sort() 함수에 대해 자세히 알고 넘어가야 하는데요.

 

sort()는 파라미터를 생략하고 사용 시 ASCII 코드를 기준으로 오름차순을 합니다.

 

function solution(strings, n) {
    var arr = [1, 7, 5, 10];
    return arr.sort();
    // [1, 10, 5, 7]
}

 

따라서 저희가 원하는 대로 오름차순으로 하려면 다음과 같이 작성해야 합니다.

 

function solution(strings, n) {
    var arr = [1, 7, 5, 10];
    return arr.sort((a, b) => a - b)
    // [1, 5, 7, 10]
}

 

왜냐하면 sort() 함수는 반복해서 보내주는 a와 b를, a - b가 0보다 작으면(음수) a를 b보다 앞에 위치, a - b가 0보다 크면(양수) a를 b 뒤에 위치시키는 방식으로 오름차순을 하기 때문입니다.

 

이러한 개념으로 문제를 풀면,

a의 n번째와 b의 n번째를 비교하여 a가 b보다 작으면, 오름차순을(-1을 리턴), a가 b보다 크면 내림차순을(1을 리턴)해주고, a의 n번째와 b의 n번째가 같으면 a와 b 자체를 비교한 후에, a가 크면 내림차순, b가 크면 오름차순이 되게끔 리턴해주면 됩니다.

댓글