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

이명진·2023년 2월 3일
0

코드카타

목록 보기
59/74

문제 요약

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

문제 풀이

내가 푼풀이

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개의 댓글

관련 채용 정보