https://programmers.co.kr/learn/courses/30/lessons/42746#
function solution(numbers) {
var answer = '';
var maxLength = 4
numbers = numbers.map(number=>number.toString())
numbers = numbers.map(number=>{
let cpy = number
if(number.length < maxLength){
let dist = maxLength - number.length
let first = cpy[0]
for(let i = 0; i < dist; i++){
cpy += first
}
}
return {
original:number,
temp:parseInt(cpy)
}
})
let sorted = numbers.sort((a,b)=>{
if(a.temp == b.temp){
let case1 = parseInt(a.original + b.original)
let case2 = parseInt(b.original + a.original)
return case2 - case1
}
else return b.temp - a.temp
})
answer = numbers.reduce((accumulator, currentValue) => accumulator + currentValue.original,"");
return answer[0] == '0' ? '0' : answer;
}
각 수들은 자리수가 다 다르기 때문에 정렬을해서 우선순위를 매기기가 어렵다.
따라서 형평성(?)있게 정렬하는 방법을 고안해냈다.
그방법은 자리수를 모두 4자리로 바꾸었고 부족한 자릿수는 수의 맨 앞에값을 넣어주었다.
예시) 31 -> 3133, 2 -> 2222 10 -> 1011
이렇게 해준이유는 해당하는 수를 어떤 수의 뒤에 붙였을때 수의 맨 앞에 값에 영향을 받기 때문이다.
예를 들면 100과 10이 있을때 1001, 1011로 바꿀 수 있고 내림차순 정렬하면 1011,1001이 되서 답이 10100이 된다.
하지만 여기서 문제는 402,4024가 있을때 변환하면 4024, 4024 이므로 4024024가 반환될 우려가 있다.(실제답은 4024402)
따라서 변환된 값이 같을때는 서로 이어붙여서 큰 값을 반환하는 쪽으로 정렬해주면된다.
마지막으로 문자열을 이어붙이다보니 "00000"이런 수가 나올 수 있기때문에 맨앞이 0이면 '0'을 반환해주면된다.
끝!