처음부터 차근차근

[프로그래머스] 가장 큰 수 본문

코딩테스트/Javascript

[프로그래머스] 가장 큰 수

HangJu_95 2023. 12. 27. 01:06
728x90

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/42746

문제 설명

문제 설명

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"

내 풀이

처음 문제를 풀 떄는 "각 원소를 String으로 만든 다음, 원소의 첫번째 값들을 비교한 다음에 동일한 값일 경우, 두번째 값들을 비교하고.." 이런 식으로 접근하였습니다. 하지만 너무나 생각이 많아지다보니 코드를 작성하지 못하고, 다른 방법을 찾아봤습니다.

다행히 이 문제는 다양한 답들이 있었습니다.

 

[프로그래머스] 가장 큰 수 in JavaScript

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

velog.io

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

다른 사람의 풀이

다른 분의 풀이법을 보고 사용했기 때문에 이것은 Pass

오늘 배운 점

Sort 메서드 동작 과정을 한번 살펴보겠습니다.

arr.sort([compareFunction]);

여기서 compareFunction은 정렬 순서를 정의하는 함수입니다.

만약 생략하면 배열은 각 요소를 문자열로 반환하고, 각 문자의 유니 코드 포인트 값에 따라 정렬합니다.

const points = [40, 100, 1, 5, 2, 25, 10];

points.sort();

// 숫자 요소들로 이루어진 배열은 의도한 대로 정렬되지 않는다.
console.log(points); // [1, 10, 100, 2, 25, 40, 5]

따라서, 숫자 요소를 정렬할 때는 sort 메서드에 정렬 순서를 정의하는 비교 함수를 인수로 전달해야 합니다.

 

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 특정 쌍이 개의 인수로 주어질 항상 동일한 값을 반환해야합니다. 일치하지 않는 결과가 반환되면 정렬 순서는 정의되지 않습니다.

예를 들어 오름차순, 내림차순 정렬을 하면 이렇게 정의할 수 있습니다.

const points = [40, 100, 1, 5, 2, 25, 10];

// 숫자 배열의 오름차순 정렬. 비교 함수의 반환값이 0보다 작으면 a를 우선하여 정렬한다.
points.sort((a, b) => a - b);
console.log(points); // [1, 2, 5, 10, 25, 40, 100]

// 숫자 배열의 내림차순 정렬. 비교 함수의 반환값이 0보다 크면 b를 우선하여 정렬한다.
points.sort((a, b) => b - a);
console.log(points); // [100, 40, 25, 10, 5, 2, 1]

 

이제 풀이법을 한번 뜯어보겠습니다.

function solution(numbers) {
    const answer = numbers
    .map((number) => String(number)) // map을 통해 모든 인자를 String으로 변환
    .sort((a,b) => (b+a) - (a+b)) // String된 인자를 합친 후 - 를 하여 비교합니다.
    // 예시  "334" - "343" 은 343가 더 큰 값이므로, "34", "3"으로 배열 순서를 변경합니다.
    .join(''); // String을 모두 합칩니다.

	return answer[0] === '0' ? '0' : answer; // numbers가 0,0이 들어올 수 있습니다.
}

'코딩테스트 > Javascript' 카테고리의 다른 글

[프로그래머스] 체육복  (0) 2024.01.02
[프로그래머스] 네트워크  (1) 2024.01.02
[LeetCode] Intersection of Two Arrays  (0) 2023.12.27
[LeetCode] Binary Search  (0) 2023.12.27
[프로그래머스] Lv2 더 맵게  (0) 2023.11.16