function solution(numbers) {
const newNum = numbers.map((v) => String(v));
const answer = newNum.sort((x, y) => {
return (y + x) - (x + y);
}).join("");
return answer[0] === '0' ? '0' : answer;
}
풀이 아이디어
- numbers의 원소를 전부 문자열로 바꿔준다.
- 문자열로 바꾼 원소들을 sort 함수를 통해서 정렬한다.
- +를 통해 비교할 문자열을 합쳐주고 다시 반대로 합쳐줘서 -를 통해 숫자로 자동 변환하여 계산해준다.
- 정렬하고 합쳐주었을 때, 큰 수를 구해야하므로 (y + x) - (x + y)순으로 계산해준다.
- 정렬이 끝났으면 join을 통해 합쳐준다.
- 원소가 전부 0일 경우 '0'하나만 return 해줘야하므로 예외 처리 해준다.
문제보단 sort 함수에 대해서 간단하게 정리하고 갈 필요가 있습니다.
arr.sort([compareFunction])
sort 함수는 위와 같은 형식으로 이루어져있는데 여기서 compareFunction의 return 값을 통해 원소의 순서가 정해집니다.
먼저, compareFunction이 제공되지 않으면 요소를 문자열로 변환하고 유니 코드 코드 포인트 순서로 문자열을 비교하여 정렬됩니다. 예를 들어 "바나나"는 "체리"앞에옵니다. 숫자 정렬에서는 9가 80보다 앞에 오지만 숫자는 문자열로 변환되기 때문에 "80"은 유니 코드 순서에서 "9"앞에옵니다.
compareFunction이 제공되면 배열 요소는 compare 함수의 반환 값에 따라 정렬됩니다. a와 b가 비교되는 두 요소라면,
compareFunction(a, b)에서 매개변수 a는 뒤의 값, b는 앞의 값입니다.
const numbers = [3, 30, 34, 5, 9];
numbers.sort((a, b) => {
console.log(a, b)
})
""
30 3
34 30
34 30
...
""
이때, 원본 배열인 arr가 정렬이 되고, 리턴하는 값 또한 원본 배열인 arr을 가리키고 있음에 유의해야합니다.