sort 메서드의 활용(문자열 내 마음대로 정렬하기)

Sunmin
Hello, world?
Published in
4 min readSep 1, 2020

프로그래머스의 ‘문자열 내 마음대로 정렬하기' 문제를 풀었다. (https://programmers.co.kr/learn/courses/30/lessons/12915)
비교적 간단하게 sort로 해결될 수 있으리라 생각했는데 그렇지 않아서 기록을 남겨보고자 한다. sort메서드에 대해 자세히 학습할 수 있는 좋은 기회였다.

우선 sort를 할 때 인덱스를 기준으로도 할 수 있는지에 대해 몰랐기 때문에 내가 생각한 방법은 [sun, bed, car], n=1기준으로
1.[usn, ebd, acr] 생성 2.이것을 오름차순으로 정렬해서 [acr,ebd,usn] 생성 3. 다시 [car,bed,sun]을 만드는 것이었다. 그런데 1번 단계부터 원하는대로 잘 이루어지지 않아서 고민하다가 해결책을 찾아보았다.

mdn의 sort 메서드의 정의를 살펴보면 아래와 같다.( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort )

arr.sort(정렬 순서를 정의하는 함수)

즉 sort 메서드가 배열의 엘리먼트들을 정의한 함수에 따라 정렬한 후, 바뀐 배열을 반환하기에 따로 반복문을 돌릴 필요가 없다.

정렬을 하는 경우는 크게 3가지로 나눌 수 있다.

1. 배열의 엘리먼트가 문자일 때

a>b, a<b 일 때 리턴되는 숫자가 양수, 음수인지에 따라 오름차순(a to z, ㄱ에서 ㅎ), 내림차순이 결정된다. 기본이 오름차순이기에 따로 정렬하는 함수를 인자로 넣지 않고, sort()라고만 해도 오름차순으로 잘 정렬이 된다.

2. 배열의 엘리먼트가 숫자일 때

즉 a-b, b-a 로 분류하면 된다. 문자와 달리 숫자는 ASCII code로 변환한 후 정렬하기에 sort()라고만 쓰면 유효한 결과값을 얻을 수 없다.

3. 배열의 엘리먼트가 객체 혹은 배열의 인덱스를 확인해야할 때

name이라는 key에 해당하는 value(문자)를 기준으로 정렬하고 싶다면 위에서 언급한 1번과 똑같이 하면 된다. 즉 a,b라는 엘리먼트를 기준으로 그 엘리먼트에서의 key에 접근하기 위해 a.name > b.name을 사용한다.

age라는 key에 해당하는 value(숫자)를 기준으로 정렬하고 싶다면 위에서 언급한 2번과 똑같이 하면 된다. 즉 a,b라는 엘리먼트를 기준으로 그 엘리먼트에서의 key에 접근하기 위해 a.age-b.age를 사용한다.

그러면 이제 정리한 것을 기준으로 문제를 풀어보면, n으로 주어진 인덱스 기준의 문자 기준으로 정렬을 해야하기에 3번에 해당됨을 알 수 있다. 또한 strings =[abce, abcd, cdx], n=1의 예처럼 같은 문자끼리 비교해야할 때는 다시 일반적인 정렬처럼 첫 번째 인덱스를 기준으로 정렬해야한다.

function solution(strings,n){
if(a[n] > b[n]) return 1;
if(a[n] < b[n]) return -1;
if(a > b) return 1;
if(a < b) return -1;
return 0;
}

즉, a[n] === b[n]인 경우에는 a > b 의 경우로 비교를 하면 된다! 🎉

--

--

Sunmin
Hello, world?

하고 싶은 것이 많은 사람이 되고 싶고, 그러기 위해 노력합니다.