js 프로그래머스 특이한정렬

이명진·2023년 2월 3일
0

코드카타

목록 보기
59/69

문제 요약

기준 값과 배열이 주어진다. 기준 값으로 부터 거리가 짧은 순으로 정렬하면된다.
만약 거리가 같을 경우 큰수가 앞으로 온다.

문제 풀이

내가 푼풀이

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 함수에 관한 고찰이라는 포스팅도 남기게 되었다.

다시한번 나중에 풀어보기 위해서 정답을 제출하지는 않았다..
분하다.. 나중에 다시 한번 풀어봐야 겠다.

profile
프론트엔드 개발자 초보에서 고수까지!

0개의 댓글