array가 주어지고 그 안에 숫자가 주어진다. 그 숫자의 조합을 통해서 가장 큰 숫자가 무엇인지를 출력하면 된다. 예를 들어, [6,10,2]
라는 배열이 있으면 이 배열을 조합해서 숫자를 만든다. 조합해서 만들 수 있는 숫자중에 가장 큰 숫자는 '6210' 이다.
그러니깐 만약에 앞자리가 같은 숫자, 64,60이 있으면 6460처럼 나열한다는 뜻이다. 그럼 로직을 짜보자
function solution(numbers) {
let sorted = numbers.sort().reverse();
var answer = "";
for (let i = 0; i < sorted.length; i++) {
sorted[i] = sorted[i].toString();
}
for (let j = 0; j < sorted.length - 1; j++) {
if (sorted[j][0] === sorted[j + 1][0]) {
if (sorted[j][sorted[j].length - 1] === "0") {
let temp = sorted[j];
sorted[j] = sorted[j + 1];
sorted[j + 1] = temp;
}
}
}
return sorted.join("");
}
근데 테스트를 해보니 3개빼고 다 틀림 ㅋㅋㅋㅋ 문제가 뭘까? 일단 다른 분들 코드를 보았는데 역시나 내 코드에 통과되지 않는 예외케이스가 있을거다. 단순히 0으로 끝나는 숫자를 뒤로 보낸다고 해결 되지 않는 경우말이다.
그럼 답안을 보자!
function othersolution(numbers) {
let answer = numbers
.map((c) => "" + c)
// sort하는 방법이 관건이었구나...
// 문자형태의 숫자도 계산이 가능하다
.sort((a, b) => b + a - (a + b))
.join("");
return answer[0] === "0" ? "0" : answer;
}
진리는 쉽고 단순하다... ㅋㅋㅋ sort를 저런식으로 할 줄은 생각못했다. 예를 들어 a:30 / b:3이라면 이어붙였을 때 330-303 가 된다. 이때 양수이면 a가 뒤로 간다 만약 음수이면 앞으로 간다. 정렬과정을 숫자로 나타내보겠다
numbers[0],[1]을 비교시작
[3,30,34,5,9]
numbers[1],[2]을 비교시작
[3,34,30,5,9]
numbers[2],[3]을 비교시작
[34,3,30,5,9]
[34,3,5,30,9]
[34,5,3,30,9]
[5,34,3,30,9]
numbers[3],[4]를 비교시작
[5,34,3,9,30]
[5,34,9,3,30]
[5,9,34,3,30]
[9,5,34,3,30]
항상 생각해야한다. 과연 이 분은 어떻게 해서 이런 쌈박한 코드를 짤 수 있었는지. 양적 승부인건지, 시각화인건지 아님 다른 방법이 있는건지. 배울 수 있음에 감사하다.