#1 가장 큰 수를 만들려면?
머리가 어질어질하네... ㅋㅋㅋ
numbers = [3, 30, 34, 5, 9]
일 때,
첫째 혹은 둘째 자릿수가 같을 때, 가령 [3, 30, 34]
내에서만 정렬을 다시 해야 하는데 이걸 못 하겠다.
우선 아래와 같이 작성해보았지만 두번째 sort
가 동작하지 않는다.
function solution(numbers) {
var answer = '';
numbers.sort((a, b) => String(b).slice(0, 1) - String(a).slice(0, 1))
numbers.sort((a, b) => {
if(String(a).slice(0, 1) === String(b).slice(0, 1)) {
String(b).slice(1, 2) - String(a).slice(1, 2)
}
})
answer = numbers.join('')
return answer;
}
#2 새로운 정렬방법
이에 대한 해법을 찾아보았는데 새로운 정렬방법을 알게되었다.
// a, b는 문자열로 가정
arr.sort((a, b) => (b + a) - (a + b))
'3'
과 '30'
이 있을 때,
b + a = '330'
과 a + b = '303'
을 비교하여 내림차순으로 정렬한다. 매우 간편하다.
따라서 변경한 알고리즘은 아래와 같다.
function solution(numbers) {
var answer = '';
numbers.sort((a, b) => (String(b) + String(a)) - (String(a) + String(b)))
answer = numbers.join('')
return answer;
}
헌데, 이렇게 하니 한 가지 오류가 생긴다. 배열이 0
으로만 이루어져있을 때이다.
테스트 케이스를 추가하니 다음과 같다.
이 경우는, 인위적으로 '0'
을 반환하도록 한다.
#3 최종
function solution(numbers) {
var answer = '';
numbers.sort((a, b) => (String(b) + String(a)) - (String(a) + String(b)))
answer = numbers.join('')
return answer[0] === "0" ? "0" : answer;
}