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함수로 싹 합쳐서 반환.