본문 바로가기
프론트엔드로 가는 길/프로그래머스

45. 특이한 정렬

by woody-j 2023. 4. 20.

https://school.programmers.co.kr/learn/courses/30/lessons/120880
[ 문제 설명 ]

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

정수 n을 기준으로 n과 가까운 수부터 정렬하려고 합니다. 이때 n으로부터의 거리가 같다면 더 큰 수를 앞에 오도록 배치합니다. 정수가 담긴 배열 numlist와 정수 n이 주어질 때 numlist의 원소를 n 으로부터 가까운 순서대로 정렬한 배열을 return하도록 solution 함수를 완성해주세요.

 

[ 문제 풀이 ]

 

첫번째 풀이

function solution(numlist, n) {
    const obj = {};
  numlist.forEach((item) => {
    obj[item] = Math.abs(item - n);
  });
return Object.keys(obj)
    .sort((a, b) => {
      if (obj[a] === obj[b]) {
        return b - a;
      } else {
        return obj[a] - obj[b];
      }
    })
    .map((item) => parseInt(item));
}

1. const obj = {}; : 빈 객체 obj 생성

2. numlist.forEach((item) => { obj[item] = Math.abs(item - n);});

key는 numlist 배열의 원소(item)로, value는 item과 n의 차이의 절댓값으로 설정

3. Object.keys(obj) : obj 객체의 모든 key 값을 배열로 추출

4. if (obj[a] === obj[b]) : value값이 동일하면 더 큰 key 값이 먼저 오도록

5. map((item) => parseInt(item)) : 정렬된 key값을 숫자로 변환하여 배열로 반환

 

두번째 풀이

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

|| b - a는 만약 두 원소의 차이의 절댓값이 같다면, 원소의 크기를 비교하여 더 큰 원소가 앞으로 정렬되도록 합니다.

 

'프론트엔드로 가는 길 > 프로그래머스' 카테고리의 다른 글

47. 캐릭터의 좌표  (0) 2023.04.24
46. 로그인 성공  (1) 2023.04.21
44. 문자열밀기  (1) 2023.04.19
43.등수매기기  (0) 2023.04.19
42. 치킨 쿠폰  (1) 2023.04.17