[ALGORITHM NINJA] 정렬 2번 가장 큰 수
테스트 케이스 분석
1~6 : [101,10] or [131,13]
같이 내 계산대로 같은 값을 갖는 경우
7~10 : 엄청 큰 수
11 : [0,0] => 0으로 출력되어야함.
내 코드 (7~11 테스트케이스 통과)
function solution {
let result = "";
const answer = numbers.map((item, index) => {
const array = `${item}`.split("");
let result = array[0] * 1000;
result += array[1] ? array[1] * 100 : array[0] * 100;
result += array[2] ? array[2] * 10 : array[0] * 10;
result += array[3] ? array[3] * 1 : array[0] * 1;
return {
result,
index: index,
};
});
answer.sort((a, b) => {
if (a.result > b.result) {
return -1;
}
if (a.result < b.result) {
return 1;
}
return 0;
});
answer.forEach((item) => {
result += `${numbers[item.index]}`;
});
result = result.replace(/(^0+)/, "");
return `${result === "" ? "0" : result}`;
}
- 엄청 큰수를
+result
또는 Number.parseInt(엄청큰수문자열)
하게되면 자연지수형태로 출력됨 (숫자너무커서)
function solution {
let result = "";
const answer = numbers.map((item, index) => {
const array = `${item}`.split("");
let result = array[0] * 1000;
result += array[1] ? array[1] * 100 : array[0] * 100;
result += array[2] ? array[2] * 10 : array[0] * 10;
result += array[3] ? array[3] * 1 : array[0] * 1;
return {
result,
index: index,
};
});
answer.sort((a, b) => {
if (a.result > b.result) {
return -1;
}
if (a.result < b.result) {
return 1;
}
return 0;
});
answer.forEach((item) => {
result += `${numbers[item.index]}`;
});
result = result.replace(/(^0+)/, "");
return `${result === "" ? "0" : result}`;
}
+result
또는 Number.parseInt(엄청큰수문자열)
하게되면 자연지수형태로 출력됨 (숫자너무커서)따라서
result = result.replace(/(^0+)/, "");
다음과 같이 모든 왼쪽의 0을 다지우고
return `${result === "" ? "0" : result}`;
빈 문자열인 경우는 0인 경우이므로 0을, 빈 문자열이 아닌 경우는 그대로 리턴해준다.
이렇게 하면 7~11번까지의 테스트케이스는 통과
내 코드 (1~11번 모두 통과)
내 코드는 1이 들어오는 경우
-
1000의 자리 수 * 1000
-
100의 자리 수 * 100
-
10의 자리수 * 10
-
1의 자리수 * 1
로 가중치를 두어 어떤 숫자가 앞에 오는게 더 큰 수가될지 판별한다.
즉, 내 코드는 앞의 4개의 경우에서 나온 값을 모두 더하였을 때 더 큰 값이 앞에 붙였을 때 더 큰 수라고 판단한다.
하지만 한가지 문제점이 있었다. 내 코드의 경우 가중치에 대한 case
는 별로 고려하지 않았다. 가중치가 같은 경우 어떤 게 앞에 와도 상관 없다고 생각하였기 때문이다.
가중치가 같더라도 100의 자리 수가 더 큰지 작은지에 따라 자릿 수가 더 많은 수가 앞에 와야하는지 뒤에 와야하는지 달라진다. 다음과 같이 말이다.
그럼 10의 자릿 수에 대해서는 고민안해도됨 ?
그렇다
ex) [110, ?]에서 110과 같은 가중치를 갖는 수는 무엇이 있을까? 110 밖에 없다. 따라서 같은 수끼리는 뒤에 놓든 앞에 놓든 상관이 없으므로 고려할 필요없다.
하지만 10000까지 정수를 받을 수 있다면 이야기는 달라진다. 110이 들어온다하더라도 같은 가중치의 다른 숫자들이 많기 때문이다.물론 11 같이 같은 가중치의 수가 한 숫자로 되어있는 경우는 제외한다.(앞 뒤로 놓든 상관이 없으므로)
1000 => 1~9 10~99 100~1000 까지 밖에 정수를 못 가지므로 100의 자릿 수만 고려하면 되고
10000 => 1~9 10~99 100~999 1000~10000 까지의 정수를 가지므로 100의자릿수와 1000의자릿수 모두 고민해야한다.
다른 풀이
function solution(numbers) {
let answer = numbers.sort((a, b) => `${b}${a}` - `${a}${b}`).join('');
return answer[0] === '0' ? '0' : answer;
}
function solution(numbers) {
let answer = numbers.sort((a, b) => `${b}${a}` - `${a}${b}`).join('');
return answer[0] === '0' ? '0' : answer;
}
우선 감탄이 나온다..
compareFunction(a, b)이 0보다 작은 경우 a가 더 작은 값이라 인식하고 앞으로 정렬합니다. 즉, a가 먼저옵니다.
compareFunction(a, b)이 0을 반환하면 a와 b를 서로에 대해 변경하지 않고 모든 다른 요소에 대해 정렬합니다.
compareFunction(a, b)이 0보다 큰 경우, b가 더 큰 값이라 생각하고 a보다 낮은 인덱스로 소트합니다.
sort의 동작방식
- 오름차순으로 정렬한다면 ? (작은수가 앞으로)
const array = [0, 1, 2, 3];
array.sort((back, front) => {
if (back > front) {
// 뒤가 더 크면 자연스러우니깐 1
return 1;
}
if (back < front) {
// 앞이 더 크면 부자연스러우니깐 -1
return -1;
}
return 0;
});
console.log(array); // [0,1,2,3]
- 내림차순으로 정렬한다면 ? (큰수가 앞으로)
const array = [0, 1, 2, 3];
array.sort((back, front) => {
if (back > front) {
// 뒤가 더 크면 부자연스러우니깐 1
return -1;
}
if (back < front) {
// 앞이 더 크면 자연스러우니깐 -1
return 1;
}
return 0;
});
console.log(array); //[3,2,1,0]
상황에 맞게 자연스러운데로 생각하자 !! (헷갈리니깐 🤪)
Reference
Author And Source
이 문제에 관하여([ALGORITHM NINJA] 정렬 2번 가장 큰 수), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@rat8397/ALGORITHM-NINJA-정렬-2번-가장-큰-수
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Author And Source
이 문제에 관하여([ALGORITHM NINJA] 정렬 2번 가장 큰 수), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@rat8397/ALGORITHM-NINJA-정렬-2번-가장-큰-수저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)