본문 바로가기

Coding Test/Programmers

[프로그래머스/JavaScript] 코딩 테스트 풀이 (문제 84 - 특이한 정렬)

728x90

 

# 문제

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



# 답안

// 1. 입력: 정수배열 numlist, 정수 n
// 2. 출력: numlist를 n으로부터 가장 가까운 순서로 정렬한 배열

// 기본적으로 (numlist요소 - n)을 뺀 절대값들을 오름차순 정렬 (가까운 순서로 정렬)할건데,
// 거리가 같으면, 즉 (numlist요소 - n)이 0인 경우에는 내림차순 정렬 (큰 순서 정렬)


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


# 인사이트

function solution(numlist, n) {
  return numlist
  		.sort((a, b) => 
        
        	// (a - b)이기 때문에 오름차순으로 정렬한다.
            	// 각 요소에서 n을 뺀 절대값을 기준으로 오름차순으로 정렬
        	Math.abs(a - n) - Math.abs(b - n) || 
            
            	// or을 썼기 때문에 앞의 비교문이 0이면
                // 즉, 두 요소가 n과의 거리가 같다면 두 요소끼리 비교해서
            	// 내림차순(b - a)으로 정렬한다.
        	b - a
        );
}

 

or 연산자는 앞에 위치한 피연산자의 불린값을 따져서 false가 나오는 경우에만 다음 피연산자로 넘어가고 true일 경우 연산을 멈추고 원래 값을 반환한다.
따라서 이 코드에서는 Math.abs(a - n) - Math.abs(b - n) 에서 값이 0(불린 값 판정으로 false)이 나오기 전까진 앞의 로직만 실행되므로 절대값의 차이가 나는 경우 내림차순 정렬,
절대값 차이가 나지 않는 같은 값일 경우에는 기존값을 기준으로 비교(b-a)하여 오름차순 정렬이 실행된다.

 

 

참고하면 좋은 게시글


https://everyhahaha.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-JS-%EB%A0%88%EB%B2%A8-0-%ED%8A%B9%EC%9D%B4%ED%95%9C-%EC%A0%95%EB%A0%AC-feat-sort

 

 

 

728x90