0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
numbers의 길이는 1 이상 100,000 이하입니다.
numbers의 원소는 0 이상 1,000 이하입니다.
정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.
def solution(numbers):
numbers = list(map(str, numbers))
numbers.sort(key=lambda x: x*3, reverse=True)
return str(int(''.join(numbers)))
numbers를 문자열 기준으로 큰 숫자로 sort하고 join하는것은 간단하지만,
[3, 30, 34, 5, 9]
입력이 이런 경우에는 3과 30의 순서가 뒤바뀐다. 답은"9534330" 이지만 "9534303"이 된다.
따라서 람다함수를 통해서 key를 숫자를 3번 이어붙인것으로 잡아서 정렬한다.
3번인 이유는 numbers의 원소가 1000이하이기 때문이다
9와 998이 있을 경우 9989 보다 9998이 더 크다. 각 자릿수가 최대의 값이 되려면 999가 최대이다.
따라서 이어붙여서 앞의 숫자 3개보다 큰지 비교해야하기 때문에 3번 이어붙이는 것이다.
4번 이어붙여도 느려지긴 하겠지만 상관은 없다!
문제 링크: https://programmers.co.kr/learn/courses/30/lessons/42746