저번에 이어 이번에도 가장 큰 수를 구하는 문제... 이틀이나 노력해보았지만 쉽지 않았다.
우선 이런 시도를 먼저 했다.
// 두 수를 비교
function compare(A, B){
let lenA = String(A).length;
let lenB = String(B).length;
// 1. 같은 자릿수
if(lenA === lenB){
if(A > B){
return A;
} else {
return B;
}
}
// 2. 다른 자릿수
else if(lenA !== lenB){
let diff = Math.abs(lenA - lenB);
let plusZero = '0'.repeat(diff);
// 2-1. 같은 앞자리여서 0만 붙이면 같은 숫자가 되는 경우 : 더 짧은 수가 이김
if(String(A) + plusZero === String(B)){
return A;
} else if(String(A) === String(B) + plusZero){
return B;
}
// 2-2. 같은 앞자리가 아니어서 짧은 수에 0붙이면 같은 자리 되는 경우 : 더 큰 수가 이김
if(lenA < lenB){
if(Number(String(A) + plusZero) > B){
return A;
} else if(Number(String(A) + plusZero) < B){
return B;
}
} else {
if(A < Number(String(B) + plusZero)){
return B;
} else if(A > Number(String(B) + plusZero)){
return A;
}
}
}
}
function solution(numbers){
let answer = '';
while(numbers.length > 0){
let max = numbers[0];
for(let i = 0; i < numbers.length; i++){
let number = numbers[i];
max = compare(max,number);
}
answer += String(max);
numbers.splice(numbers.indexOf(max),1);
}
return answer;
}
핵심 아이디어는 loop문을 돌아가며 계속 비교해가며 가장 적합한 수를 찾아서 더해주며 큰 수를 찾아내는 것...
결과는 처참했다;;
아무래도 내가 아예 잘못 생각하고 있는 것은 아닌지...
내가 너무 과하게 생각하고 있었다...
// 두 수를 비교
function compare(A, B){
let strA = String(A);
let strB = String(B);
if(strA + strB > strB + strA){
return A;
} else {
return B;
}
}
이렇게만 해줘도 되는 것을..!!! 그래도 시간초과가 나온다. 아랫부분을 손봐야겠다. O(n^2)가 나오는거 같은데 다른 방법이 없나..?
function solution(numbers){
let answer = '';
numbers.sort((A,B)=>{
let strA = String(A);
let strB = String(B);
// 내림차순 정리. 요건 항상 헷갈리더라. 그냥 해보자.
if(strA + strB > strB + strA){
return -1;
} else {
return 1;
}
})
answer = numbers.join('');
if(Number(answer) === 0){
return '0'
}
return answer;
}
이런 젠장..! 이렇게 쉬운거를 이상하게 너무 어렵게 생각하고 있었다니..!
그냥 string으로 변환해서 두 수 중에 더 큰거 나오는거 반환시키는 sort
함수 하면 되는거였자나!! 😢