항상 그냥 오름차순 내림차순 정렬할때 무지성으로 썻던 메소드인데, 코테 풀면서 알게된 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
}'TIL' 카테고리의 다른 글
| 7월 19일 - pull 제때제때 받기 (0) | 2023.07.19 |
|---|---|
| 7월 18일 TIL (2) | 2023.07.18 |
| 7월 14일 TIL - too many re-renders. react limits the number of renders to prevent an infinite loop. (0) | 2023.07.14 |
| 7월 12일 TIL (0) | 2023.07.13 |
| 7월 11일 TIL - TypeError: Cannot read properties of undefined (reading 'map') (0) | 2023.07.11 |