/**
* 가장 큰 수
* 정렬
* https://programmers.co.kr/learn/courses/30/lessons/42746?language=javascript
*
*/
export function solution(numbers) {
const answer = numbers.map((num) => num.toString()).sort((a, b) => {
const pre = parseInt(a + b);
const post = parseInt(b + a);
return post - pre;
}).join("");
if (answer[0] === '0') return '0';
return answer;
}
console.log(solution([6, 10, 2]));
console.log(solution([3, 30, 34, 5, 9]));
console.log(solution([0, 0, 0, 0])); // 11번 테스트 케이스
sort 를 위한 비교를 할 때 3, 30, 34 가 있다고 하면, 이 문제에 한해선 3이 30 보다 앞에 나와야한다. 34, 3, 30 순으로 나와야하는데 그 이유는 숫자를 합쳤을 때 334 보다 343이 크고, 303 보다 330이 크기 때문이다. 처음엔 인덱스 순으로 모두 비교해서 처리하려 했으나 고민 끝에 앞뒤로 숫자를 합쳐서 비교하게됐다. (즉, 303과 330 비교)
0만 여러개있을 경우 0의 갯수만큼 합쳐져서 나오는 관계로 엣지 케이스 처리해줘야한다. 문자열이 0으로 시작할 경우 0보다 같거나 작을 수 밖에 없는 나머지 문자열도 모두 0이므로 '0'을 return 해준다.
const maxValue = require("./가장큰수");
test('[6, 10, 2]', () => {
expect(maxValue.solution([6, 10, 2])).toBe("6210");
});
test('[3, 30, 34, 5, 9]', () => {
expect(maxValue.solution([3, 30, 34, 5, 9])).toBe("9534330");
});
test('[0, 0, 0, 0] - 11번 테스트 케이스', () => {
expect(maxValue.solution([0, 0, 0, 0])).toBe("0");
});
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스][자바스크립트][Level1][카카오] 실패율 (0) | 2022.01.05 |
---|---|
[프로그래머스][자바스크립트][Level2] H-Index (0) | 2022.01.04 |
[프로그래머스][자바스크립트][Level1] 없는 숫자 더하기 (0) | 2022.01.04 |
[프로그래머스][자바스크립트][Level3] 베스트 앨범 (0) | 2022.01.04 |
[프로그래머스][자바스크립트][Level2] 다리를 지나는 트럭 (0) | 2022.01.03 |
댓글