✨ Lv. 2 - 가장 큰 수
문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/42746
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
처음에는 단순히 localeCompare
를 활용하여 문자열끼리 비교를 통해 정렬하여 join
하는 방식을 생각하였습니다. 다만, localeCompare
을 활용한 정렬 결과는 우리가 구하고자 하는 숫자의 조건과 맞지 않습니다.
[ 우리가 구하고자 하는 수 ]
- 주어진 정수를 이어 붙여 만들 수 있는 가장 큰 수
- 그렇다면 정렬 기준이 달라야하지 않을까?
- 두 수를 이어 붙였을 때, 더 큰 수가 되는 순서대로 정렬해보자.
따라서 아래와 같이 코드를 작성해 정렬하여 return 하였습니다. 다만, 주어진 숫자가 전부 0일 경우를 고려하여 return 문을 작성하였습니다.
function solution(numbers) {
let result = numbers.sort((a, b) => {
if(+`${a}${b}` > +`${b}${a}`) return -1;
if(+`${a}${b}` < +`${b}${a}`) return 1;
}).join('');
return result.split('').filter((v) => v !== '0').length ? result : '0';
}
return 문은 result
의 가장 앞쪽에 위치한 값을 이용하여 더 간단하게 작성할 수 있습니다. 만약 가장 앞에 위치한 값이 0
이라면, 가장 큰 값이 0
이라는 의미이기 때문에 해당 입력값은 전부 0
이라 판단할 수 있습니다. 이를 이용하여 수정한 코드는 아래와 같습니다.
function solution(numbers) {
let result = numbers.sort((a, b) => {
if(+`${a}${b}` > +`${b}${a}`) return -1;
if(+`${a}${b}` < +`${b}${a}`) return 1;
}).join('');
return result[0] !== '0' ? result : '0';
}