제목 그대로 특이한 정렬이었다
정수 n을 넣으면 n을 기준하여 가까운 순으로 배열을 정렬하는 문제
처음엔 배열을 오름차순으로 정렬하고 n의 인덱스를 찾아 앞뒤의 원소를 비교하는 방법으로 할랬는데...배열 내부에 n이 없는 경우도 있었다
정답률 70%대 오니까 갑자기 어려워지는데요ㅠㅠ
한참 헤매다가 찾은 방법
Math.abs()를 이용하면 되는 것이었다
Math.abs()-> 인수의 절대값을 반환하는 메서드
Array.sort()는 이용해야겠다 생각은 했으나 평소 오름차순, 내림차순에만 사용했어서 정확히 작동되는 원리를 모르니 엄청 헤맸다
Array.sort()는 콜백함수와 사용할 수 있는데, 이 콜백함수로 두 요소를 비교할 수 있다.
[1, 4, 7, 24, 5, 10].sort((a, b) => a - b)
// [1, 4, 5, 7, 10, 24] 오름차순 정렬
[1, 4, 7, 24, 5, 10].sort((a, b) => b - a)
// [24, 10, 7, 5, 4, 1] 내림차순 정렬
오름차순 정렬의 함수 내부의 동작 방식은 아래와 같다
a - b가 0보다 클 경우(양수), 즉a > b일 경우, 순서를 바꾼다
a - b가 0보다 작을 경우(음수), 즉a < b일 경우, 순서를 바꾸지 않는다
a - b가 0일 경우, 즉a === b일 경우, 순서를 바꾸지 않는다
동작방식을 알고나니 sort()를 좀 더 잘 사용할 수 있을것 같은 기분이 든다...!
function solution(numlist, n) {
numlist.sort((a, b) => {
// n과의 거리를 절대값으로 비교
const distanceA = Math.abs(a - n)
const distanceB = Math.abs(b - n)
if(distanceA === distanceB) {
return b - a
}
return distanceA - distanceB
})
return numlist
}
distanceA - distanceB를 하는데 왜 a랑 b의 순서가 정해지는거지라고 생각했으나 자세한 동작방식을 알고나니 이해가 됐다