programmers - 정렬 - 가장 큰 수

marafo·2020년 8월 10일
post-thumbnail

문제 설명

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

제한 사항

∙ numbers의 길이는 1 이상 100,000 이하입니다.
∙ numbers의 원소는 0 이상 1,000 이하입니다.
∙ 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.

주어진 배열의 숫자들을 문자열의 관점에서 대소 비교하는 문제.
단순히 sort( (a,b) => a - b )의 방식으로는 해결에 어려움이 있다.

두 번째 테스트 케이스를 보면 3과 30 중에 3이 더 앞에 나와야 되기 때문에
단순 숫자형 대소 비교 말고 다른 방법을 찾는다.

function solution(numbers){
    let answer = numbers.map(c=> c + '').
    				sort((a,b) => {
                        a = String(a);
                        b = String(b);
                        return (b+a) - (a+b);
                    }).join('');
    
    return answer[0]==='0'? '0' : answer;
}

다른 사람의 직관적인 솔루션.

function solution(numbers){
    let answer = [];
    
    function alignment(a,b){
        return (b+a) - (a+b);
    }
    
    for( let i = 0 ; i < numbers.length ; i++){
        answer.push( numbers[i] + '' );
    }
    
    answer.sort( alignment);
    
    if( answer[0] !== '0'){
        return answer = answer.reduce( (sum, current) => sum + current);
        // return answer.join('');
    }
    else{
        return '0';
    }
    
}

위 솔루션을 바탕으로 이해하고 다시 내 방식으로 바꾼 코드.

1) numbers의 원소들을 문자열로 바꿔서 answer에 넣는다.
2) alignment라는 함수를 이용해서 sort()를 정의할 수 있다.
이 부분이 문제 해결의 절반 이상. 3과 30의 케이스를 보면 330과
303의 대소를 비교하기 위해서 (b+a) - (a+b)로 반환값을 얻는다.
3) 이렇게 정렬한 answer 배열의 0번째 원소가 '0'이 되면 나머지도 '0'이 되고 리턴값도 '0'으로 한다. '0'이 아닐 때는 배열을 reduce함수로 싹 합쳐서 반환.

profile
프론트 개발자 준비

0개의 댓글