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 strNumbers = numbers.map(num => num.toString());
// 문자열로 변환한 숫자들을 서로 연결하여 비교하는 방식으로 정렬
strNumbers.sort((a, b) => (b + a) - (a + b) > 0 ? 1 : -1);
// 정렬된 문자열들을 연결하여 결과를 생성
let answer = strNumbers.join('');
// 예외사항) 만약 모든 숫자가 0이라면 "0"을 반환
return answer[0] === '0' ? '0' : answer;
}
생각하기
- 정수가 주어진것들이 string 처리 되었을때, 가장 큰 수를 찾는 방식.
- 생각해보니까 이거, 문자열로 치환하고 sort(b-a)쓰면 역사전순 치환되니까, 가장 큰 사전순으로 나오지 않을까?
- 먼저 number에 들어있는 아이들을 ,을 기준으로 잘라내주고, 그다음 모두 string으로 바꾼 후에
- 역사전순으로 sort 정렬해주고, 그걸 join 해서 answer에 넣으면 해결되는게 아닐까?
풀이하기
1. 숫자열을 먼저 문자열로 변환해준다, map을 이용해서.
2. 그 다음 문자열로 변환된 숫자들을 내림차순으로 했더니, 문제가 발생. 전 문제 기준으로 생각해서, 문자열을 서로 연결해서 비교하는 방식으로 수정하였다.
3. 그 다음 정렬된 문자들을join()
을 이용해서 하나로 붙여주면 완성.
4. 문제는 여기서 발생, undefined가 뜨길래 왜 일까 하고 고민하다가 찾아보니, 0이 들어갔을때 오류가 나는걸로 나옴. 그래서 0이 들어가있다면, 그냥 0을 반환하는걸로 했음.
function solution(numbers) {
var answer = numbers.map(v=>v+'')
.sort((a,b) => (b+a)*1 - (a+b)*1)
.join('');
return answer[0]==='0'?'0':answer;
}
배울점
1. `map` 함수에서 `(v => v+'')`를 아직 이해 못한듯. 이게 `toString`이랑 똑같다는데. 흠.
2. `sort()`에서 *1을 해주면 다시 숫자열로 변환한다고 함. 이것도 몰랐다.