본문 바로가기

Algorithm

[알고리즘] #24 정수 내림차순으로 배치하기 | 프로그래머스

728x90

내림차순으로 배치하기 알고리즘 문제.

 

https://programmers.co.kr/learn/courses/30/lessons/12933

 

코딩테스트 연습 - 정수 내림차순으로 배치하기

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

programmers.co.kr

 

 

 

 


 

 

 

문제 설명

 

함수 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 

 

프로그래머스

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

programmers.co.kr

 

 

다른 사람들의 문제 풀이를 살펴보다보니 문자열로 변경해서 푸는 것보다 숫자로만 계산했을 때의 시간 효율이 더 좋다고 한다.

 

함수 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

728x90