[프로그래머스] 가장 큰 수 (정렬/ javascript/js)

2021. 5. 4. 13:30Front-end/알고리즘

728x90
반응형

문제 설명

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다. 0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

제한 사항

numbers의 길이는 1 이상 100,000 이하입니다. numbers의 원소는 0 이상 1,000 이하입니다. 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.

입출력 예

numbers return
[6, 10, 2] 6210
[3, 30, 34, 5, 9] 9534330

 


내가 작성한 코드 (자바스크립트)

function solution(numbers) {
  let answer = numbers.sort((a, b) => {
    return String(b) + String(a) - (String(a) + String(b));
  });
  answer = answer[0] === 0 ? "0" : answer.join("");
  return answer;
}

arr.sort([compareFunction])

: 인자로 정렬 순서를 정의하는 함수를 넣는다. 생략하면 배열은 각 요소의 문자열 변환에 따라 각 문자의 유니 코드 코드 포인트 값에 따라 정렬된다.

반환값으로 새로운 배열 값을 만드는 것이 아닌, 원 배열의 정렬된 배열 값이 나온다.

 

  • compareFunction(a, b)이 0보다 작은 경우(음수) a를 b보다 낮은 색인(인덱스)으로 정렬한다.. 즉, a가 먼저 온다.
  • compareFunction(a, b)이 0을 반환하면 a와 b를 서로에 대해 변경하지 않고 모든 다른 요소에 대해 정렬한다.
  • compareFunction(a, b)이 0보다 큰 경우(양수), b를 a보다 낮은 인덱스로 정렬한다. b가 먼저온다.
  • compareFunction(a, b)은 요소 a와 b의 특정 쌍이 두 개의 인수로 주어질 때 항상 동일한 값을 반환해야 한다. 일치하지 않는 결과가 반환되면 정렬 순서는 정의되지 않는다.

 

우선 두번째 입출력에서 numbers = [3, 30, 34, 5, 9]인데

답이 9534330이므로 9,5,34,3,30 순으로 정렬되기 위해서는

자바스크립트의 sort 함수를 이용해야 하는데, 이 때 3과 30이 비교 대상이라면 '330'이 큰지 '303'이 큰지 비교하여 정렬을 해주어야 한다. 이 때 3, 30 순으로 정렬이 되어야 큰 수 이기 때문에 sort안에 들어갈 compareFunction(a,b)는 음수가 나와야 한다. 그러므로 (b+a) - (a+b)를 return으로 넣어준다. 이 때 그냥 더하는게 아니라 문자열로 단순히 붙여주어야 하기 때문에 String을 사용한다.

 

그리고 또 하나로, numbers에 모두 0 이 들어가 있을 경우도 생각해야 한다.

만약 numbers = [0,0,0]이라면 answer는 000이 되는데, 이 경우에는 0이라고 출력해야 하므로

answer의 첫번째 원소가 0 이라면 answer는 0으로 출력하도록 삼항연산자를 사용한다.

728x90
반응형