일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- JWT
- typescript
- css
- nestjs
- html
- 코딩테스트
- LifeCycle
- Spring
- Deep Dive
- 인접리스트
- REST API
- 자료구조
- bean
- MySQL
- GraphQL
- 탐욕법
- dfs
- Kubernetes
- java
- 인접행렬
- Linux
- javascript
- Interceptor
- puppeteer
- 알고리즘
- 프로그래머스
- TIL
- winston
- OOP
- node.js
- Today
- Total
처음부터 차근차근
[프로그래머스] 가장 큰 수 본문
문제 링크
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으로 만든 다음, 원소의 첫번째 값들을 비교한 다음에 동일한 값일 경우, 두번째 값들을 비교하고.." 이런 식으로 접근하였습니다. 하지만 너무나 생각이 많아지다보니 코드를 작성하지 못하고, 다른 방법을 찾아봤습니다.
다행히 이 문제는 다양한 답들이 있었습니다.
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 |