https://programmers.co.kr/learn/courses/30/lessons/42746
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
제한사항
입출력 예
- 처음에는 permutations를 이용해 구했으나 시간 초과 오류가 났다.(당연)
from itertools import permutations def solution(numbers): numbers = list(map(str, numbers)) tmp = list(map(''.join, permutations(numbers))) return max(tmp)
- 도저히 풀 수 없어 다른코드를 참고했다.
numbers를 문자열로 정렬한 후 람다를 이용해 x에 3을 곱해주었다. 여기서 곱해준다는 의미는 문자열을 곱한다는 것이다.
왜 3을 곱해주었는가?
입출력 예제 2번 째에서 '3'과 '30'중 3을 더 크다고 판단해야 하기 때문이다.
30 을 더 큰 수로 판단하면 결과는 '9534303'이 되어버린다.
x에 3을 곱하면 '333'과 '303030' 중 문자열 정렬이기 때문에 '333'을 크다고 판단한다.
그럼 반드시 3을 곱해야 하는가?
4도 통과고 5도 통과다. 하지만 2는 안된다. 키포인트는 제한사항에 나와있는 숫자의 크기가 최대 1000이하로 3자리 수까지 가능하다는 점이다.
def solution(numbers): numbers = list(map(str,numbers)) numbers.sort(key = lambda x : x*2, reverse=True) return str(int(''.join(numbers)))
.sort()
numbers = [2,3,10] numbers = list(map(str, numbers)) numbers.sort() print(numbers)
위의 출력결과는 ['10', '2', '3']이다.
문자열이기 때문이다.
숫자의 크기가 아닌 문자열의 정렬이다.