초보 개발자의 성장 일기

특이한 정렬, 매개변수와 가까운 순서대로 정렬 본문

Development/Algorithm

특이한 정렬, 매개변수와 가까운 순서대로 정렬

YUNA 2023. 11. 22. 01:16

문제 설명

정수 n을 기준으로 n과 가까운 수부터 정렬하려고 합니다. 이때 n으로부터의 거리가 같다면 더 큰 수를 앞에 오도록 배치합니다. 정수가 담긴 배열 numlist와 정수 n이 주어질 때 numlist의 원소를 n으로부터 가까운 순서대로 정렬한 배열을 return하도록 solution 함수를 완성해주세요.

 

나의 문제 해결 방법

배열의 첫번째부터 마지막까지 반복문을 돌려서 n과 빼기 연산을 했을 때 절대값이 가장 작은 순서대로 배열을 정렬한다.(거품정렬) 그리고 만약 절대값이 같을경우 뒷 숫자가 클 때 앞 배열과 위치를 바꾼다.

function solution(numlist, n) {
    let temp = 0;
    for (let i = 0; i < numlist.length - 1; i++) {
        for (let j = 0; j < numlist.length - 1 -i; j++) {
            if (Math.abs(n - numlist[j]) > Math.abs(n - numlist[j + 1])) {
                temp = numlist[j];
                numlist[j] = numlist[j + 1];
                numlist[j + 1] = temp;
            } else if((Math.abs(n - numlist[j]) === Math.abs(n - numlist[j + 1]))) {
                if(numlist[j] < numlist[j + 1]) {
                    temp = numlist[j];
                    numlist[j] = numlist[j + 1];
                    numlist[j + 1] = temp;
                }                 
            }
        }
    }
    return numlist;
}

 

 

다른 해결 방법

function solution(numlist, n) {
  return numlist.sort((a, b) => Math.abs(a - n) - Math.abs(b - n) || b - a);
}

자바스크립트의 sort()는 음수를 반환하면 a가 먼저, 양수면 b가 순서가 먼저 되도록 짜여져 있다. b랑 a의 거리가 같은 상황 즉 Math.abs(a - n) - Math.abs(b - n)이게 0이 되는 상황이 되면 ||연산자 뒤가 실행되면서 같은 거리일 경우 큰 수를 먼저 나오도록 반환한다. 내가 코드를 짰을 때는 매우 긴 코드였는데 한줄로 끝낼 수 있다는게 허무하기도 했지만 더 열심히 공부해서 짧고 간단하게 로직을 짤 수 있도록 연구를 많이 해야 겠다.