문제
풀이
function solution(numbers) {
numbers.sort();
for (let i = numbers.length - 1; i > 0; i--) {
const lNumStr = numbers[i - 1].toString();
const rNumStr = numbers[i].toString();
if (lNumStr.charAt(0) === rNumStr.charAt(0)) {
const case1 = lNumStr + rNumStr;
const case2 = rNumStr + lNumStr;
if (+case1 > +case2) {
// 순서 교체
let temp = numbers[i - 1];
numbers[i - 1] = numbers[i];
numbers[i] = temp;
}
}
}
let answer = '';
numbers.reverse();
for (let number of numbers) {
answer += number.toString();
}
return answer;
}
먼저 numbers배열을 인자없이 sort() 정렬하고 반복문을 돌면서 인접한 두 수의 첫째자리 수를 비교하여 다르면 넘어가고 같다면 두 수를 어떤 순서로 붙였을 때 더 큰 수가 나오는지 확인한다음 더 큰 수가 나오도록 자리를 교체했다.
결과
왜 대부분의 테스트에서 통과하지 못했을까 생각하며 다시 코드를 보니.. 순서를 교체하고 난 뒤에 다시 순서를 정렬했을 때 더 큰 수가 나올 수도 있다는 사실을 간과하고 코드를 짰다.
다른 사람의 풀이
function solution(numbers) {
const answer = numbers
.map(n => n.toString())
.sort((a, b) => (b + a) - (a + b))
.join('');
return answer[0] === '0' ? '0' : answer;
}
sort를 사용해 숫자로 이루어진 문자열도 정렬할 수 있다는 사실과 compareFunction을 (a, b) => (b + a) - (a + b)와 같이 사용할 수 있음을 배웠다..
'자료구조와 알고리즘 > programmers' 카테고리의 다른 글
정렬 > K번째 수 (0) | 2021.06.15 |
---|