당장 떠오르는 방법은 모든 숫자 조합을 만들어서 그 중에 가장 큰 값을 반환하는 겁니다.
하지만 경우의 수가 (numbers.length)!
개나 있기 때문에 시간 초과가 날 게 뻔하죠.
현명하게 이 문제를 해결하는 방법을 생각해봅시다.
결국 반환되는 값은 numbers의 원소들로 이루어져있고
이 원소들을 특정한 규칙에 의해 '정렬'시키면
우리가 원하는 답으로 이끌어낼 수 있습니다.
[9, 30, 5]
를 정렬할 때
오름차순일 땐 [5, 9, 30]
내림차순일 땐 [30, 9, 5]
의 결과가 나오지만
우리가 원하는 결과는 [9, 5, 30]
입니다.
보통 오름차순, 내림차순 정렬할 땐
두 수를 그저 대소 비교합니다.
예를 들어 [9, 30]
을 내림차순 정렬했을 때
9
와 30
을 비교시 9 < 30
이기 때문에 [30, 9]
가 결과로 나옵니다.
우리가 원하는 정렬을 위해선
단순 대소 비교는 쓸 수 없고
큰 수를 만들기 위해 두 수를 조합해서 어떤 수가 앞으로 와야할 지 기준으로 정렬을 시켜야합니다.
[9, 30]
일 때 두 수를 서로 이어붙여서 하나는 930
하나는 309
로 만들어주는 겁니다.
그리고 이어붙인 두 수를 비교하면 930 > 309
가 되니까 결과는 그대로 [3, 30]
이 됩니다.
단순 버블 정렬을 한다 생각했을 때
우리가 원하는 답의 형태로 만들어질 때까지
인접한 두 수를 우리가 찾아낸 규칙으로 정렬을 시키기 때문에
[9, 30, 5]
는 [9, 5, 30]
이 됩니다.
function solution(numbers) {
return numbers.reduce((a, b) => a + b)
? numbers.sort((a, b) => ('' + b + a) * 1 - ('' + a + b) * 1).join('')
: '0';
}
numbers
의 모든 요소가 0인 경우는 예외처리합니다.