기준 값과 배열이 주어진다. 기준 값으로 부터 거리가 짧은 순으로 정렬하면된다.
만약 거리가 같을 경우 큰수가 앞으로 온다.
function solution(numlist, n) {
let answer = [];
let target = numlist[0]; //n이 numlist에 없는 경우가 있어서 선언
numlist.forEach(x=>{
let a = Math.abs(target-n);
let b = Math.abs(x-n);
if(a>b){
target =x
}
});//n이 없을 경우 그나마 거리가 짧은 것을 타깃으로 지정
numlist.sort((a,b)=>a-b); // 오른차순으로 정렬
// 타겟의 인덱스 위치로 왼쪽으론쪽 반으로 쪼개기
let idx = numlist.indexOf(target);
let left = numlist.slice(0,idx).reverse();
let right = numlist.slice(idx+1);
answer.push(target)
let cnt = Math.max(left.length,right.length);
// 하나씩 비교해가면서 정렬해주기
for(let i=0;i<cnt;i++){
let leftX = left[i]
let rightX = right[i];
let charL = Math.abs(n-leftX);
let charR = Math.abs(n-rightX);
if(charL<charR){
leftX&&answer.push(leftX)
rightX&& answer.push(rightX)
}else{
rightX&& answer.push(rightX)
leftX&&answer.push(leftX)
}
}
return answer;
}
알고리즘을 공부하다가 합병정렬을 배우게 되어서 써먹게 되었다.
문제를 풀다보니 n값이 주어진 함수내에 없는 경우도 있다.
그래서 target으로 구해주고 합병정렬 형식으로 문제를 풀었다.
코드가 길고 지저분해서 리팩토링 할수는 없나 생각을 해봤지만 내 머리로는 어려운것 같다.
일단 문제부터 통과하자는 마음에 제출을 눌렀는데 2번 케이스만 안풀렸다.
그래서 질문하기를 찾아보니 대부분 2번문제가 안풀리는듯 싶었다.
그래서 답변에 써있는 반례들을 넣어봤는데 이상하게 나는 다 풀렸다.
왜 2번문제가 틀릴까 고민해보다가 시간초과가 나는 게 아닐까 라는 생각을 하게 되었고
어디서 문제일지 계속 꼼꼼이 훑어보다가 문제가 안풀려서 힌트를 찾아보게 되었다.
찾아보니 놀랐다. sort함수 한가지로 짧게 풀수 있는 문제였다..
function solution(numlist, n) {
return numlist.sort((a,b) => {
const [aGab, bGab] = [Math.abs(a-n), Math.abs(b-n)]
// 거리가 같다면 더 큰 수를 우선 배치
if(aGab === bGab) return b-a
// 다르다면 거리별 오름차순 정렬
return aGab-bGab
})
}
훨씬 간결하다.. sort사용법을 잘 모르는것 같아서 sort 함수에 관한 고찰이라는 포스팅도 남기게 되었다.
다시한번 나중에 풀어보기 위해서 정답을 제출하지는 않았다..
분하다.. 나중에 다시 한번 풀어봐야 겠다.