Lv.0 - 특이한 정렬_01.07🥲

송철진·2023년 1월 7일
0

문제 설명

정수 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]

나의 코드

function solution(numlist, n) {
  	numlist.sort((a,b)=>b-a)
    let obj = {}
    const sub = numlist.map(el => Math.abs(el-n))
    const subM100 = sub.map(el => el*100)
    for(let i=0; i<subM100.length; i++){
        obj[subM100[i]+i] = 0
    }
    const index = Object.keys(obj).map(el=>el%100)
    let answer = []
    for(let i=0; i<index.length; i++){
        answer.push(numlist[index[i]])
          
    }
    return answer
}

풀이

우선 n으로부터의 거리가 동일한 경우 더 큰 수를 배치해야 하므로 numlist를 오름차순으로 정렬한다

numlist.sort((a,b)=>b-a)

n으로 부터의 거리의 집합을 배열sub라 하고

const sub = numlist.map(el => Math.abs(el-n))

n으로 부터의 거리인덱스를 객체 obj에 키로 넣어줄 것이다
obj에 삽입된 키들은 자동으로 오름차순 정렬된다

let obj = {}
const sub = numlist.map(el => Math.abs(el-n))
const subM100 = sub.map(el => el*100)
for(let i=0; i<subM100.length; i++){
    obj[subM100[i]+i] = 0
}

obj의 키를 뽑아 n으로 부터의 거리의 인덱스만 매핑한 배열을 index라 하고

const index = Object.keys(obj).map(el=>el%100)

index의 값을 index로 하는 numlist의 값을 차례로 빈배열 answer에 삽입하고 순회가 종료되면answer를 반환한다

let answer = []
for(let i=0; i<index.length; i++){
    answer.push(numlist[index[i]])
}
return answer

다른 풀이(스크랩)

function solution(numlist, n) {
  return numlist.sort((a, b) => Math.abs(a - n) - Math.abs(b - n) || b - a);
}
profile
검색하고 기록하며 학습하는 백엔드 개발자

0개의 댓글