https://programmers.co.kr/learn/courses/30/lessons/42746
let result = [];
// let numbers = [0, 0, 0, 1];
function solution(numbers) {
numbers.sort();
let res = [];
for (var i = 0; i < numbers.length; i++) {
res.push(numbers[i].toString());
}
res.sort((a, b) => {
return (b + a) - (a + b);
})
var answer = res.join('');
//console.log(parseInt(answer));
if (parseInt(answer) == 0) answer = '0';
return answer;
}
핵심은
res.sort((a, b) => {
return (b + a) - (a + b);
})
이 부분이다.
두 문자를 연결해서 더 큰 걸 리턴한다.
[3, 30]의 경우 303과 330을 비교해서 내림차순 리턴.
위의 sort는 숫자를 비교하였다.
하지만 문제에서 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다. 라는 조건이 있다.
그래서 join을 이용하여 문자열로 바꾸고 답을 출력한다.
let result = [];
let numbers = [3, 30, 444, 34, 5, 9]
function solution(numbers) {
numbers.sort();
let result = '';
console.log(numbers);
let res = [];
for (var i = 0; i < numbers.length; i++) {
res.push(numbers[i].toString());
}
console.log(res);
for (var i = res.length - 1; i >= 0; i--) {
if (i !=0 && res[i].length > res[i - 1].length) {
let temp = res[i];
res[i] = res[i - 1];
res[i - 1] = temp;
}
console.log(res);
result += res[i];
}
return result;
}
가장 먼저 순열을 생각하다가 정답case를 보면 [6,10,2]의 경우 6210으로 앞의 자릿수가 큰 게 먼저 나온다.
그냥 sort를 하게되면 숫자가 문자열취급되어 정렬이되어 [10,2,6]이 되니까 뒤에서 부터 연결하였다.
그리고, 두번째 testcase의 경우 3가 30에서 303이 출력되어 앞뒤로 문자 길이를 비교해서 큰 경우 위치를 바꿔 출력하려 하였다.
(작성하면서 보니 단순히 길이만 비교하고, 앞자리 숫자 크기조차 비교안했네? ;;;)
역시나 바로 실패하였고, 이유는 바로 찾았다.
let numbers = [3, 30, 444, 34, 5, 9]
이 경우 444가 중간이 아닌 젤 마지막에 들어가게 된다.
그 다음 sort에 대해서 좀 더 읽어보고, 두 숫자를 연결해서 비교하는 걸 찾았다.
function solution(numbers) {
numbers.sort();
let res = [];
for (var i = 0; i < numbers.length; i++) {
res.push(numbers[i].toString());
}
res.sort((a, b) => {
return (b + a) - (a + b);
})
return res.join('');
}
비교 전에 문자열로 변경하여 res배열에 담고, 비교하였다.
하지만 위의 경우 11번째 testcase에서 실패가 떳다.
질문게시판을 찾아보니 0인 경우가 있다더라.
let numbers = [0, 0, 0]의 경우 000으로 출력이 된다.
if (parseInt(answer) == 0) answer = 0;
문자열 answer를 int로 변경 후 0이면 0으로 변경하였다.
하지만 한번 더 실패가 발생한다.
왤까 생각하면서 문제를 다시 읽다보니 조건에 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.라는 구문이 있다.
if (parseInt(answer) == 0) answer = '0';
로 변경하니 통과하였다.
조건을 잘 읽자..
나는 result라는 새 배열에 toString으로 숫자값을 string으로 바꿔 넣어서 결과를 도출했는데, 많은 사람들이 map()을 이용하였다.
var answer = numbers.map(c => c + '').sort((a, b) => (b + a) - (a + b)).join('');
map()은 안의 식을 적용한 새로운 배열을 만들어 준다.
+''을 하여서 문자열로 바뀐듯 하다.
그후 join을 하여 문자열로 만들어주었다.
그 다음 0처리는 3항연산자를 이용한다.
answer[0]==='0'? '0' : answer;
이렇게 적용하면 두 줄로 줄일 수 있다.
대단한 사람들..
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
가장 큰 수 - 정답게시판 (풀고나면 접근 가능)