[Programmers] 정수 내림차순으로 배치하기

2022. 9. 28. 18:52기록/Programmers

    목차

문제 설명

함수 solution은 정수 n을 매개변수로 입력받습니다.

n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요.

예를들어 n이 118372면 873211을 리턴하면 됩니다.

 

제한 조건

  • n은 1이상 8000000000 이하인 자연수입니다.

 

입출력 예

n return
118372 873211

나의 문제 풀이

function solution(n) {
    var answer = '';
    
    n = n.toString().split('').sort((a, b) => b - a).forEach((num) => {
        answer += num;
    });
    
    return parseInt(answer);
}

주어진 정수를 문자열로 만들고 한 글자씩 쪼개어 배열의 원소로 넣어주었고

sort() 함수를 사용해 내림차순으로 배열을 정렬하여 forEach 로 하나씩 꺼내 누적해 주었다.

 

숫자 배열에 sort() 함수를 사용하면 숫자를 문자로 변환하여 정렬하기 때문에

만약 ['1', '2', '3', '11', '22', '33'] 숫자 배열에 sort() 함수를 사용하여 정렬하면

['1, '11', '2', '22', '3', '33'] 으로 리턴하여 잘못된 숫자 정렬이 된다.

 

숫자 배열을 정상적으로 정렬하기 위해서는 sort() 함수의 인자로 비교 함수를 넣어 주어야한다.

 

function compare(a, b) {
  if(a > b) return 1;
  if(a < b) return -1;
  return 0;
}

 

비교 함수는 비교될 두 숫자 a, b 중에 a 가 더 큰 경우 1을 리턴하고, b 를 a 보다 앞의 인덱스에 정렬한다.

또한 b 가 더 큰 경우 1을 리턴하고, a 를 b 보다 앞의 인덱스에 정렬한다.

만약 두 숫자가 같다면 0을 리턴하여 현재의 정렬 상태를 유지한다.

 

// 오름차순
숫자배열.sort((a, b) => a - b);

// 내림차순
숫자배열.sort((a, b) => b - a);

비교 함수의 동작 방식을 최대한 간단하게 줄이면 이렇게 사용할 수 있다.


다른 사람의 문제 풀이

function solution(n) {
  const newArr = (n + "").split("").sort().reverse().join("");
  return +newArr;
}

주어진 정수에 "" 를 더해서 문자열로 만들고 "" 를 기준으로 배열의 원소로 넣어주었다.

배열에는 문자가 하나씩만 들어있기 때문에 sort() 함수를 사용해도 위에서와 같이 잘못 정렬되지 않는다.

 

오름차순으로 정렬된 배열에 reverse() 함수를 통해 거꾸로 정렬해주고,

join() 함수를 사용하여 각 배열의 원소들을 합쳐서 하나의 문자열로 만들어준다.

마지막에는 문자열 앞에 + 연산자를 붙여주어 숫자로 자동 형변환 시켜서 리턴해 주었다.

 

배열에는 문자열이 아니라 문자가 하나씩만 들어있다는 것을 이용해서

sort() 함수와 reverse() 함수를 함께 이용한 것이 인상적이었다.

데이터 타입에 따른 sort() 함수의 동작 방법을 정확히 알고 사용하는 것이 필요하다는 것을 알게 되었다.