CODING TEST/Programmers
[ JavaScript ] 프로그래머스 level2 42746번 가장 큰 수
JUNGY00N
2024. 1. 28. 04:16
가장 큰 수 #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 합니다.
[6, 10, 2] | "6210" |
[3, 30, 34, 5, 9] | "9534330" |
나의 풀이
function solution(numbers) {
const arr = numbers.sort((a, b) =>
a[0] !== b[0]
? a[0] - b[0]
: (b.toString() + a.toString()) - (a.toString() + b.toString())
);
return arr[0] === 0 ? "0" : arr.join("");
}
- 자바스크립트의 sort함수에는 옵션을 지정해줄 수 있다.
- 옵션을 지정해주지 않으면 가장 앞자리에서부터 비교한다. (수 비교 시 옵션 필수로 지정해주어야 하는 이유)
- 내가 생각한 방법은
- 수의 가장 앞자리가 같지 않으면 앞자리가 더 큰수가 앞으로 가도록 (내림차순) 정렬하고,
- 수의 가장 앞자리가 같으면 두 수를 string으로 변환 후 더하여 문자열로 만들어 준뒤 비교하여 더 큰 수가 앞으로 가도록 정렬했다.
- 그리고 만약 numbers가 [0,0,0] 이라면 000이 아닌 0이 출력되게 하기 위해 정렬 후 배열의 첫번째 값이 0이면 "0"을 출력하고,
- 0이 아니면 arr을 ""으로 join하여 string으로 리턴해주었다.
다른 풀이
function solution(numbers) {
const answer = numbers.sort((a, b) => `${b}${a}` - `${a}${b}`).join("");
return answer[0] === "0" ? "0" : answer;
}
- 나의 풀이에서는 앞자리가 같은지를 비교하고, 문자열로 바꾸느라 비효율적인 코드였는데,
- 생각해보면 앞자리가 같던 다르던 두 수를 문자열로 바꾸고 비교하여 정렬해주는 것이 더 간단한 방법이다.
- 또한 굳이 toString을 쓸 필요 없이, 백틱 안 중괄호 안에 수를 넣어 비교하여 더 깔끔하고 가독성 좋은 코드가 되었다.