0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
입출력 | 예 |
---|---|
numbers | return |
[6, 10, 2] | "6210" |
[3, 30, 34, 5, 9] | "9534330" |
Array.prototype.sort()
메소드에 단순히 return a - b
말고도 다른 방식으로 활용할 수 있음을 깨닫게 해주는 문제이다.3 vs 30
과 같은 경우인데, 상당히 획기적인 compareFunc를 작성함으로써 해결할 수 있었다. (그래서 난이도와 다르게 코드 양은 엄청 짧음)3
과 30
을 받았을 때, 각각을 문자열로 바꾼 다음 +
연산자를 통해서 concat한 결과끼리 빼서 (303 - 330
) 결과에 따라서 3
과 30
의 순서를 정렬을 하는 것이다!!🚨주의할 점!!
함정 케이스로[0, 0, 0, ..., 0]
이 들어가있을 수 있다. 그런 경우 따로 처리해주지 않으면answer
에'00000'
과 같은 문자열이 들어갈 수 있으므로 이런 케이스를 따로 처리해주자.
function solution(numbers) {
var answer = '';
answer = numbers.sort((next, prev) => {
return (prev.toString() + next.toString()) - (next.toString() + prev.toString());
}).join("");
if (answer[0] === '0')
return '0';
else return answer;
}
덕지덕지 붙어 있는 Number.prototype.toString()
을 없애보자.
이를 위해서는 처음에 numbers
를 받았을 때 안에 있는 숫자들을 다 문자로 만들고 그 배열에다가 처리하는 방법이 있겠다.
Number.prototype.toString()
적용하기String()
으로 각각의 숫자를 감싸기""
) 이어붙이기const number1 = 123.1;
const number2 = 123;
const str1 = `${number1}`;
const str2 = `${number2}`;
function solution(numbers) {
var answer = '';
var num_to_str = numbers.map(num => num + '');
answer = num_to_str.sort((next, prev) => {
return (prev + next) - (next + prev);
}).join("");
if (answer[0] === '0')
return '0';
else return answer;
}
functools
의 cmp_to_key
를 이용하여 구현할 수 있다.from functools import cmp_to_key
def compare(x, y):
r1 = x + y
r2 = y + x
return 1 if int(r1) < int(r2) else -1
def solution(numbers):
# 우선 다 문자열로 바꿔준다.
numbers = [str(num) for num in numbers]
result = sorted(numbers, key=cmp_to_key(compare))
answer = ''.join(result)
answer = answer if answer[0] != '0' else '0'
return answer
def solution(numbers):
# 우선 다 문자열로 바꿔준다.
numbers = [str(num) for num in numbers]
result = sorted(numbers, key=lambda x: x*3, reverse=True)
answer = ''.join(result)
answer = answer if answer[0] != '0' else '0'
return answer