정수 내림차순으로 배치하기 - array.sort()

조해빈·2023년 1월 2일
0

프로그래머스

목록 보기
7/15

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

문제 설명
함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다.

제한 조건
n은 1이상 8000000000 이하인 자연수입니다.

입출력 예
n return
118372 873211

풀이 과정

아래는 처음 작성한 오답이다.

function solution(n) {
    let a = '';
    let b = '';
    let z = '';
    let N = n;
    do {
        a = N%10;
        b = Math.floor(N/10)%10;
        if (a>=b) {
            z += a+'';
            n = Math.floor(n/10);
        } else {
            z += b+'';
            n = Math.floor(n/100)+''+a;
        }
        N = n;
        console.log(a, b, z, n);
    } while (n>0);    
    return parseInt(z);
}


결괏값 738211이 도출되는 과정을 console.log()로 확인했다.
1의 자리에서부터 함수를 진행하여 차곡차곡 앞뒤 자리수보다 더 큰 숫자가 쌓이게끔 함수를 작성하였으므로, 가장 큰 수가 변수 z의 가장 처음에 쌓이게 되지 않고 있다.
다시 생각하여 배열로 접근하고자 했다. 배열로 접근할 시 사용할 수 있는 다양한 배열 메소드가 있단 점을 떠올렸기 때문이다.
우선 상수 n의 모든 자리 숫자를 각각의 배열 요소로 가지는 배열을 만들었고,

    let z = [];
    do {
        z.push(n%10);
        n = Math.floor(n/10);
    } while (n>0);

이렇게 도출된 변수 z는 입출력 예시 n=118372일 시 [ 2, 7, 3, 8, 1, 1 ] 가 된다. 이를 활용하여 답안을 완성해봤다. 배열 메소드 Math.max(...n)과 z.indexOf(), z.splice(index, length)를 주로 이용했다.

function solution(n) {
    let a = '';
    let z = [];
    do {
        z.push(n%10);
        n = Math.floor(n/10);
    } while (n>0);
    
    do {
        let currMax = Math.max(...z);
        a += currMax+'';
        z.splice(z.indexOf(currMax), 1);
    } while (z.length>0);
    
    return parseInt(a);
}


여기까지 해놓고 제출 후 n에 0이 들어갔을 경우에도 잘 작동하는지, n이 한 자리 수여도 잘 작동하는지 등 혹시라도 놓쳤을 오류의 여부를 확인했다.
제출하니 통과하였다. 다른 분들의 답안을 확인하였다.

1

여러 분들이 아래와 같이 이런 식의 답안을 냈다.
스트링화 한 n의 복사체에 .sort().reverse()를 하는 것이 주요 개념이다.

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


위와 아래는 동일하나 아래는 parseInt()로 답안을 확실하게 정수화 하고 있다.

이걸 보니 알았다... 배열 메소드인 sort()를 알았다면 훨씬 더 간결하게 풀이할 수 있었다.

.sort().reverse() : 배열을 오름차순으로 재정렬한 뒤 ---> 역순으로 재정렬하고 있다.

2

function solution(n) {
    return (n + '').split('').sort((a, b) => b - a).join('') * 1;
}


sort((a, b) => b - a)가 낯설어 검색했다.

https://velog.io/@seonj102/javascript-sort

단순했다.

위를 모두 참고하여 내 답안을 개선했다.

function solution(n) {
    let a = '';
    let z = [];
    do {
        z.push(n%10);
        n = Math.floor(n/10);
    } while (n>0);
    z = z.sort((a,b)=>b-a).join('')*1;
    return z;
}

훨씬 깔끔해졌다.
이렇게 되면 매개변수로 들어온 상수 n은 잦은 스트링화를 거칠 필요가 없으므로 속도 면에서도 우수할 것이다.

profile
JS, CSS, HTML, React etc

0개의 댓글