내림차순으로 배치하기 알고리즘 문제.
https://programmers.co.kr/learn/courses/30/lessons/12933
문제 설명
함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다.
제한 조건
- n은 1이상 8000000000 이하인 자연수입니다.
입출력 예
< 문제 풀이 >
function solution(n) {
let arr = (n + '').split('')
let reverse = arr.sort().reverse().join('');
let num = parseInt(reverse);
return num;
}
함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다.
생각해보기. 역순으로 만들어주는 기능을 생각해보자. sort로 정렬하거나 reverse 사용하기.
//sort() 역순으로 정렬하기 예시
const points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return b - a});
이 문제를 풀 당시에는 sort 역순 기능에 대해서는 잘 몰라서 reverse() 메소드가 간단히 바꿀 수 있기에 reverse를 사용하였다.
여기까지 과정을 다시 정리해본다. 118372를 873211로 만들어주는 문제이다. 118372는 + '' 문자열과 더함으로써 문자열로 변경되었다. 그리고 문자열이 된 상태에서 split을 사용하여 문자 하나하나가 각각 나눠져서 배열로 만들어졌다. ['1', '1', '8', '3', '7', '2']가 되었다. 여기서 sort()로 ['1', '1', '2', '3', '7', '8'] 으로 1차 적으로 정렬을 한 후 reverse로 역순으로 ['8', '7'', '3', '2', '1', '1'] 이렇게 바꾸어준다. 그러면 이제 나눠진 문자열을 하나로 합쳐야한다. 여기서 join()을 쓰면 배열의 엘리먼트들을 합쳐준다. join(' '를 기준으로 나누겠음). 그러면 [873211]로 바뀌게 된다. 그 다음 마지막으로 숫자로 바꿔줄 수 있도록 parseInt를 쓰면 873211로 원하는 숫자를 리턴할 수 있게 되었다.
function solution(n) {
let arr = (n + '').split('')
let reverse = arr.sort().reverse().join('')*1;
return reverse;
}
다시 복기하는 과정에서 parseInt를 빼버렸다. reverse가 [873211]인 상태에서 숫자 1을 곱해주면 숫자로 형변환해준다. 그래서 간단하게 873211로 변경완료.
다른 사람들은 어떻게 풀었을까?
https://programmers.co.kr/learn/courses/30/lessons/12933/solution_groups?language=javascript
다른 사람들의 문제 풀이를 살펴보다보니 문자열로 변경해서 푸는 것보다 숫자로만 계산했을 때의 시간 효율이 더 좋다고 한다.
함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다.
function solution(n) {
//숫자계산 방식
//숫자가 분명히 더 빠름
var nums =[];
do{
// 10으로 나눈 나머지를 num 배열에 넣어준다.
// 반복되면서 118372에서 2,7, 3, 8, 1, 1 순으로 nums에 푸쉬된다.
nums.push(n%10);
// 위에서 10으로 나눌 때, 11837.2 가 될 것이다.
// 이때 또 나누면 1183.72로 번거로워지므로 여기서 소수점을 신경쓰지 않게 해준다.
n=Math.floor(n/10);
} while(n>0)
// 배열을 역순으로 만들고 *1을 곱해서 숫자로 형변환하기
return nums.sort((a,b)=>b-a).join('')*1;
//문자방식
//문자는 느림
return (n+"").split('').sort((a,b)=>b-a).join('')*1;
}
참고
Array.join( ) https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/join
Array.Sort() https://www.w3schools.com/js/js_array_sort.as
Math.floor() https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Math/floor
'Algorithm' 카테고리의 다른 글
[알고리즘] #21 이상한 문자 만들기 | 프로그래머스 | 테스트 실패 원인 (공백) (0) | 2022.01.19 |
---|---|
[알고리즘] #22 자릿수 더하기 | 프로그래머스 (0) | 2022.01.19 |
[알고리즘] #23 자연수 뒤집기 | 프로그래머스 | map(Number) | parameter 와 argument (0) | 2022.01.19 |
[알고리즘] #20 완주하지 못한 선수 | 프로그래머스 (0) | 2022.01.19 |
[알고리즘] #17 문자열 다루기 기본 | 프로그래머스 (0) | 2022.01.19 |