🗃️javascript/프로그래머스

특이한 정렬(Lv.0)[코테는 어려워]

하얀성 2023. 4. 9. 12:15

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


제한사항
  • 1 ≤ n ≤ 10,000
  • 1 ≤ numlist의 원소 ≤ 10,000
  • 1 ≤ numlist의 길이 ≤ 100
  • numlist는 중복된 원소를 갖지 않습니다.

입출력 예numlistnresult
[1, 2, 3, 4, 5, 6] 4 [4, 5, 3, 6, 2, 1]
[10000,20,36,47,40,6,10,7000] 30 [36, 40, 20, 47, 10, 6, 7000, 10000]

입출력 예 설명

입출력 예 #1

  • 4에서 가까운 순으로 [4, 5, 3, 6, 2, 1]을 return합니다.
  • 3과 5는 거리가 같으므로 더 큰 5가 앞에 와야 합니다.
  • 2와 6은 거리가 같으므로 더 큰 6이 앞에 와야 합니다.

입출력 예 #2

  • 30에서 가까운 순으로 [36, 40, 20, 47, 10, 6, 7000, 10000]을 return합니다.
  • 20과 40은 거리가 같으므로 더 큰 40이 앞에 와야 합니다.

<설계>


answer[0]이 처음부터 n보다 작은 값이라면?
-> n과 가장 가까운 값이 음수배열에 있는지 양수배열에 있는지부터 파악해준다.

모든 값에 n을 뺀다.
절댓값 씌운 뒤에 순서대로 정렬. [1,1,2,3,3]
가장 작은 앞의 값을 기준으로 삼는다.anwer[0]로 삼는다.(+를 곱하고 n을 더해준다.)
(그럼 같은 거리의 뒤의 값은여? 있다면 answer[1]로 삼는다.(-를 곱하고 n을 더해준다. )



answer[0]값을 기준으로 작은 값과 큰값들의 배열 각각을 만든다.

뺀상태?
뺀상태에서 서로의 배열에 같은 값이 있는가 확인.
절댓값 같은게 없다면 각 배열에서 절댓값을 비교해가면서 작은 배열에서 뽑아냈다면 -를 곱하고 n더하기 / 큰 배열에서 뽑았으면 +를 곱하고 n더하기
절댓값 같은게 있다면  뒷배열에서 먼저 뽑아내기.

answer에 차곡차곡 나열하기.


출력.


마지막 반복문에서 원하는 값을 빼주고, 다시 그 작은 배열 값에서 내가 빼준값이 속한 배열을 찾아 빼줘야 하는데

그걸 구현 못해서 포기.

일단 애시당초 코드가 너무 길다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
function solution(numlist, n) {
    let answer = [];
    let sortArr =[];
    let minusArr =[];
    let plusArr =[];
    let standard = 0;
    for(let num of numlist){
        sortArr.push(Math.abs(num-n))    
        if(num < n){
            minusArr.push(num -n)
        }else{
            plusArr.push(num -n)
        }   
    }
    
    sortArr.sort((a,b)=> a-b)
    minusArr.sort((a,b)=> a-b)
    plusArr.sort((a,b)=> a-b)
    
    if(minusArr.indexOf(`${sortArr[0]}`) !== -1){ 
       // n과 가장 가까운 값이 n보다 작은 값이라면? 다시 음수로 되돌리고 n을 더한다.
        standard = sortArr[0* -1 + n
        minusArr.shift()// answer에 준 만큼 줄이기
    }else {
        standard = sortArr[0+ n
        plusArr.shift() // answer에 준 만큼 줄이기
    }
    answer.push(standard)
    
    if(sortArr[0=== sortArr[1]){ 
        sortArr[1= sortArr[1* -1 + n 
        answer.push(sortArr[1])
        minusArr.shift() // n보다 작은 값들의 배열에서, 가장 n과 가까운 값을 빼줌.
    }
    // 여기까지 standard의 위치파악
    
//     for(let num of numlist){
        
//     }
    for(let i=0; i<numlist.length; i++){
        let new_num = Math.min(minusArr[0],plusArr[0])
        answer.push(new_num)
        if(minusArr[0]. )
    }    
cs

 


<정답>

 

다들 함수 안에 함수를 쓰는 이 생각해내기도 어려운 것들을 써내는... wow.

난 알고리즘 합병정렬에서야 이 상수 안의 배열 방식을 맛보기로 만나봤을 뿐인데..(당연히 생각은 해내도 써먹지 못함.)

 

다들 정말 다 스스로 번뜩여서 푼것일까? 

답을 배낀걸까? 

뭐가 됬든 내 부족함만이 보일뿐이니 열심히 해야겠다.

function solution(numlist, n) {
    let result = []
    result = numlist.sort((a, b) => {
        const [numA, numB] = [Math.abs(a - n), Math.abs(b - n)];
        if(numA === numB){
            return b - a;
        }
        return numA - numB;
    })
    return result;
}