Algorithm/Programmers

[Programmers/JS] 가장 큰 수

hyebin Lee 2022. 1. 31. 18:21
더보기

주저리주저리..

 

자신있게 뭐야 쉽잖아 이러고 술술 풀다가,,  코드 실행 통과! 아싸!

제출했더니 테스트의 빨간 줄이 마구 쳐졌다.

테스트케이스는 정말 중요하구나 ,,^^

가장 큰 수

문제 설명

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

제한 사항
  • numbers의 길이는 1 이상 100,000 이하입니다.
  • numbers의 원소는 0 이상 1,000 이하입니다.
  • 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.
입출력 예numbersreturn
[6, 10, 2] "6210"
[3, 30, 34, 5, 9] "9534330"

<code>

function solution(numbers) {
  var answer = numbers
    .map((number) => number.toString())
    .sort((a, b) => b + a - (a + b))
    .join("");
  //console.log(answer);
  return answer.replace(/^0+/, "0");
}
//solution([23, 232, 212, 21]);

이 문제의 핵심은 sort((a,b) => (b+a) - (a+b)) 이 부분이었다!

map함수로 입력받은 number을 문자로 변환 후 

변환된 문자를 연결하여 비교정렬한다. 

 

문자를 + 로 계산하면 ? 

잘 합쳐지는 것을 볼 수 있다.

 

이렇게 합쳐진 문자를 정렬한다!

그리고 마지막 핵심 2! numbers 배열이 0으로만 구성되어 있을 경우는 '0'만 출력한다.

 


이 방법은 다른 분들을 참고하여 발견한 알고리즘이다.

출처: https://code-reading.tistory.com/81 [CodeReading]

 

숫자를 반복해서 최대가 1000이하이므로 4자리수까지 자른다.

이게 무슨 말이냐면

 

[6, 10, 2] => [6666, 1010, 2222] => [6666, 2222, 1010] => [6, 2, 10] => "6210"


이런식으로!

 

function solution(numbers) {
if(numbers.reduce((a, b) => a + b) === 0 ) {
return "0";
} else {
var x = numbers.sort(function(i, j) {
return (String(j).repeat(4).slice(0, 4)) - (String(i).repeat(4).slice(0, 4))
})
var result = x.map(answer => String(answer)).reduce((a, b) => a + b);
return result;
}
}

numbers 가 [0, 0, 0, 0] 이라면? 그냥 0이 나오므로 if문으로 if 문으로 배열을 돌면서 만약 모두 값이 0이라면 "0" 을 리턴

변수 x 에는 j - i 의 역순의 배열넣는데, 이때 repeat() 메소드는 문자만 가능!

따라서 sting 으로 변경된 숫자를 4번 반복 후 slice(0,4)로 왼쪽부터 4자릿수 끊어줌.