프로그래머스 0단계 - 특이한 정렬

이종현·2024년 1월 17일
0

코딩테스트

목록 보기
18/24
post-thumbnail

문제 설명

정수 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. 문제 이해

  • 정수 n과의 차이가 적은 것들부터 앞에 정렬하고 그 중에서도 큰 숫자를 먼저 오도록 정렬
  • input은 10^3 이기 때문에 시간복잡도는 O(n^2) 까지 괜찮음

2. 접근 방법

  • 직관적으로 생각하기
    • 일단 비어있는 배열을 선언하고,
    • 기존 배열을 mapping하는데, 기준이 되는 n과의 차이에 따라 해당하는 item을 새로운 배열에 넣는다.
    • 정렬된 배열을 만들고 차이가 적은 것의 인덱스를 이용해서 기존 numlist 배열에 있는 요소를 찾아서 새로운 배열에 push한다.

3. 코드 설계

  • 나한테 생각보다 어려워서 일단 설계를 먼저 생각하기가 생각보다 쉽지 않아서 일단은 바로 구현부터 들어가봤음..

4. 코드 구현

function solution(numlist, n) {
  var answer = []

  const nMinusArr = [...numlist].map((v) => Math.abs(v - n))
  const sortArr = [...nMinusArr].sort((a, b) => a - b)

  for (let i = 0; i < sortArr.length; i++) {
    const index = nMinusArr.indexOf(sortArr[i])
    const lastIndex = nMinusArr.lastIndexOf(sortArr[i])
    if (sortArr[i] === sortArr[i + 1]) {
      answer.push(Math.max(numlist[index], numlist[lastIndex]))
    } else {
      if (sortArr[i] === sortArr[i - 1]) {
        answer.push(Math.min(numlist[index], numlist[lastIndex]))
      } else {
        answer.push(numlist[index])
      }
    }
  }

  return answer
}

다른 사람 풀이

function solution(numlist, n) {
  return numlist.sort((a, b) => Math.abs(a - n) - Math.abs(b - n) || b - a);
}

회고

지금 문제 풀이할 때의 컨디션이 안 좋아서 그런건지 문제의 난이도가 나한테는 살짝 어려워서 그런건지, 이번 문제는 코드 설계하는 부분에서 아이디어가 잘 안떠올라서 바로 구현부터 시작했다. 다음부터는 설계부분에서 조금 더 생각해보고 다시 진행해보자.

profile
데이터리터러시를 중요하게 생각하는 프론트엔드 개발자

0개의 댓글