[JS] 가장 큰 수

DARTZ·2023년 6월 21일
0

알고리즘

목록 보기
123/135

문제 링크

풀이코드

function solution(numbers) {
    const newNum = numbers.map((v) => String(v));
    const answer = newNum.sort((x, y) => {
      return (y + x) - (x + y);
    }).join("");
    return answer[0] === '0' ? '0' : answer;
}

풀이 아이디어

  1. numbers의 원소를 전부 문자열로 바꿔준다.
  2. 문자열로 바꾼 원소들을 sort 함수를 통해서 정렬한다.
  3. +를 통해 비교할 문자열을 합쳐주고 다시 반대로 합쳐줘서 -를 통해 숫자로 자동 변환하여 계산해준다.
  4. 정렬하고 합쳐주었을 때, 큰 수를 구해야하므로 (y + x) - (x + y)순으로 계산해준다.
  5. 정렬이 끝났으면 join을 통해 합쳐준다.
  6. 원소가 전부 0일 경우 '0'하나만 return 해줘야하므로 예외 처리 해준다.

Sort함수

문제보단 sort 함수에 대해서 간단하게 정리하고 갈 필요가 있습니다.

MDN Sort함수
참고한 블로그

arr.sort([compareFunction])

sort 함수는 위와 같은 형식으로 이루어져있는데 여기서 compareFunction의 return 값을 통해 원소의 순서가 정해집니다.

먼저, compareFunction이 제공되지 않으면 요소를 문자열로 변환하고 유니 코드 코드 포인트 순서로 문자열을 비교하여 정렬됩니다. 예를 들어 "바나나"는 "체리"앞에옵니다. 숫자 정렬에서는 9가 80보다 앞에 오지만 숫자는 문자열로 변환되기 때문에 "80"은 유니 코드 순서에서 "9"앞에옵니다.

compareFunction이 제공되면 배열 요소는 compare 함수의 반환 값에 따라 정렬됩니다. a와 b가 비교되는 두 요소라면,

  • compareFunction(a, b)이 0보다 작은 경우 a를 b보다 낮은 색인으로 정렬합니다. 즉, a가 먼저옵니다.
  • compareFunction(a, b)이 0을 반환하면 a와 b를 서로에 대해 변경하지 않고 모든 다른 요소에 대해 정렬합니다. 참고 : ECMAscript 표준은 이러한 동작을 보장하지 않으므로 모든 브라우저(예 : Mozilla 버전은 적어도 2003 년 이후 버전 임)가 이를 존중하지는 않습니다.
  • compareFunction(a, b)이 0보다 큰 경우, b를 a보다 낮은 인덱스로 소트합니다.
  • compareFunction(a, b)은 요소 a와 b의 특정 쌍이 두 개의 인수로 주어질 때 항상 동일한 값을 반환해야합니다. 일치하지 않는 결과가 반환되면 정렬 순서는 정의되지 않습니다.

compareFunction(a, b)에서 매개변수 a는 뒤의 값, b는 앞의 값입니다.

const numbers = [3, 30, 34, 5, 9];

numbers.sort((a, b) => {
	console.log(a, b)
})
""
30 3
34 30
34 30
...
""

이때, 원본 배열인 arr가 정렬이 되고, 리턴하는 값 또한 원본 배열인 arr을 가리키고 있음에 유의해야합니다.

profile
사람들이 비용을 지불하고 사용할 만큼 가치를 주는 서비스를 만들고 싶습니다.

0개의 댓글