문제 설명
함수 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이 한 자리 수여도 잘 작동하는지 등 혹시라도 놓쳤을 오류의 여부를 확인했다.
제출하니 통과하였다. 다른 분들의 답안을 확인하였다.
여러 분들이 아래와 같이 이런 식의 답안을 냈다.
스트링화 한 n의 복사체에 .sort().reverse()를 하는 것이 주요 개념이다.
function solution(n) {
const newN = n + "";
const newArr = newN.split("").sort().reverse().join("");
return +newArr;
}
위와 아래는 동일하나 아래는 parseInt()로 답안을 확실하게 정수화 하고 있다.
이걸 보니 알았다... 배열 메소드인 sort()를 알았다면 훨씬 더 간결하게 풀이할 수 있었다.
.sort().reverse() : 배열을 오름차순으로 재정렬한 뒤 ---> 역순으로 재정렬하고 있다.
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은 잦은 스트링화를 거칠 필요가 없으므로 속도 면에서도 우수할 것이다.