[문제 링크]
[문제 풀이]
아직 혼자 생각하고 풀 실력이 되지 않아 정답을 보고 따라하고 이해하려고 노력하였다.
정답
function solution(numbers) {
let answer = numbers.map((number) => number.toString())
.sort((a, b) => (b + a) - (a + b))
.join("");
return answer[0] === '0' ? '0' : answer;
}
정해져 있는 값이 아니니 const
가 아닌 let
으로 선언하였다.
map()
함수는 배열 내의 요소들에 대하여 호출한 함수를 적용한 결과를 모아 새로운 배열을 반환한다.
문제 조건에 문자열로 변환하라는 조건이 있었으니 number
에 있는 숫자를 toString()
함수로 문자열로 바꾸고 새로운 배열을 만들어준다.
그 후, 배열을 정렬하여 크기를 비교하기 위해 sort()
를 이용한다.
sort()
는 파라미터가 생략되면 오름차순으로 정렬을 하기 때문에 내림차순으로 정렬하기 위해 두 문자열을 비교하는 내용을 넣어준다.sort()
는 반환하는 값이 음수일 경우 a가 b보다 먼저 온다.(빠른 순서)두 번째 테스트 케이스를 보면 numbers = [3, 30, 34, 5, 9]
인데 답이 9534330이므로 정렬이 9, 5, 34, 3, 30 순으로 되야 한다.
예를 들어 3과 30을 비교하면 ‘330’과 ‘303’중에 어떤게 큰 지 비교하여 정렬해야 한다.
(b+a)
에는 ‘303’이 들어가고 (a+b)
에는 ‘330’이 들어가므로 빼주면 음수가 나오므로 a인 3이 먼저 오고 b인 30이 나중에 오므로 ‘330’이 순서가 먼저되어 맞게 정렬이 된다.반대의 예를 들면 34와 9를 비교하면 ‘349’와 ‘934’중에 어떤게 큰지 비교하여 정렬해야 한다.
(b+a)
에는 ‘934’이 들어가고 (a+b)
에는 ‘349’가 들어가므로 빼주면 양수가 나오므로 b인 9가 먼저 오고 a인 34가 나중에 오므로 ‘934’가 순서가 먼저되어 맞게 정렬이 된다.join()
을 이용해 순서를 비교한 문자열들을 하나로 연결한 최종 문자열을 반환한다.