TIL

7월 17일 TIL - sort 메서드 리턴값

양죠니 2023. 7. 17. 20:03

항상 그냥 오름차순 내림차순 정렬할때 무지성으로 썻던 메소드인데, 코테 풀면서 알게된 sort의 비밀

까진 아니고 그냥 알게된 sort 내부사정

 

오름차순

[50,30,20,7].sort((a,b) => {
	return a-b; // return 값이 0보다 작으면 a를 우선하여 정렬
})
// [7, 20, 30, 50]

 

내림차순

[50,30,20,7].sort((a,b) => {
	return b-a; // return 값이 0보다 작으면 b를 우선하여 정렬
})
// [50, 30, 20, 7]

 

=> 비교함수의 반환값이 0보다 작으면 비교함수의 첫 번째 인자를 우선하여 정렬하고, 0이면 정렬하지 않으며, 0보다 크면 두 번째 인수를 우선하여 정렬한다

 

 

 

 

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

 

프로그래머스

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

programmers.co.kr

 

const numlist = [1, 2, 3, 4, 5, 6];
const n = 4;

numlist 배열의 각 값들과 n과 비교하여, n과 가까운 수부터 재배열하는 문제.

만약 n과 거리가 같은 값이 있다면 크기가 큰 것 부터 배치하면 됨

 

let answer = [];
for(let i = 0; i < numlist.length; i++){
        answer.push([numlist[i], Math.abs(numlist[i] - n)])
    }

numlist의 길이만큼 for문 돌리면서

빈 배열 answer에다가 numlist[i] 인덱스의 값을 answer[i][0] 위치의 값으로 주고, 해당 인덱스의 값에서 n을 뺀 값에 절댓값을 Math.abs() 메서드를 사용해서 구해, numlist[i]의 값과 n과의 거리를 answer[i][1]인덱스로 넣어준다

 

// numlist = [1, 2, 3, 4, 5, 6];
// answer = [ [ 1, 3 ], [ 2, 2 ], [ 3, 1 ], [ 4, 0 ], [ 5, 1 ], [ 6, 2 ] ]

그럼 answer 배열에는 위와같이 이중배열로 값들이 들어간다.

 

이제 answer의 내부 배열 인덱스 1의 값들을 비교해서 재배열을 해줘야한다. 여기서 sort메서드를 사용했다

 

 

 answer.sort((a,b)=>{
        if(a[1] == b[1]) {
            return a[0] < b[0] ? 1 : -1
        }
    })

answer[2][1] 과 answer[5][1] 처럼 거리가 같은 경우에는 answer[2][0]보다 answer[5][0]가 더 크니까 answer[5][0]이 앞으로 배치되어야 한다.

sort 메서드는 a, b를 파라미터로 받고 리턴되는 값이 0보다 작으면 a가 앞으로 0보다 크면 b가 앞으로 온다

if문으로 n까지의 거리가 같은 케이스를 걸러주어 삼항연산자를 통해  a[0] < b[0] 비교 후 참이라면 b[0]이 먼저 배치되어야 하기 때문에 1을 리턴해주고 거짓이라면 a[0]이 먼저 배치되어야 하기 때문에 -1을 리턴해준다

 

거리가 같지 않은 일반적인 경우에는 그냥 거리가 작은 순대로 재배치해주면 되기 때문에

 return a[1] < b[1] ? -1 : 1

이렇게 ,,

 

answer.sort((a,b)=>{
        if(a[1] == b[1]) {
            return a[0] < b[0] ? 1 : -1
        }
        return a[1] < b[1] ? -1 : 1
    })

재배열해주는 코드를 전체로 보면 이렇고

 

sort 후 answer 배열을 출력해보면

[ [ 4, 0 ], [ 5, 1 ], [ 3, 1 ], [ 6, 2 ], [ 2, 2 ], [ 1, 3 ] ]

이렇게 잘 들어왔다!

이제 내부배열의 0번째 인덱스의 값만 뽑아와서 리턴해주면 된다

 

  const arr = []
   for(let i = 0; i<answer.length; i++){
        arr.push(answer[i][0])
    }
    return arr

끗 ㅜ

 

⭐️ sort 메서드는 a, b를 파라미터로 받고 리턴되는 값이 0보다 작으면 a가 앞으로 0보다 크면 b가 앞으로 온다 !!!!!!! 

 

헷갈려서 죽을뻔했다

 

 

 

function solution(numlist, n) {
    let arr = [];
    let answer = []
    for(let i = 0; i < numlist.length; i++){
        answer.push([numlist[i], Math.abs(numlist[i] - n)])
    }
    
    answer.sort((a,b)=>{
        if(a[1] == b[1]) {
            return a[0] < b[0] ? 1 : -1
        }
        return a[1] < b[1] ? -1 : 1
    })
    
    for(let i = 0; i<answer.length; i++){
        arr.push(answer[i][0])
    }
    return arr
}