def solution(numbers):
numbers_str = [str(num) for num in numbers]
numbers_str.sort(key=lambda num: num*3, reverse=True)
return str(int(''.join(numbers_str)))
sort, sorted의 Parameter
key, reverse 매개변수를 갖고 있음
- key
: 정렬을 목적으로 하는 함수를 값으로 넣음, 정렬할 기준을 정할 수 있음
: lambda를 이용할 수 있음길이 len() 기준으로 정렬 >> str_list = ['좋은하루','good_morning','굿모닝','niceday'] >> print(sorted(str_list, key=len)) # 함수 ['굿모닝', '좋은하루', 'niceday', 'good_morning']
str 기준으로 정렬 >> print(sorted(str_list, key=lambda x : x[1])) # 람다 ['niceday', 'good_morning', '굿모닝', '좋은하루']
풀이 코드 중 정렬 함수를 보면 num*3을 하여 재정렬 하는 것이다.
numbers_str.sort(key=lambda num: num*3, reverse=True)
num *3 하는 이유는
numbers가 [3, 30, 34, 5, 9]로 되어 있는 상태에서
내림차순으로만 정렬하면 ['9', '5', '34', '30', '3'] 결과가 나온다.
하지만, ['9', '5', '34', '3', '30'] 이러한 결과가 나와야 한다.
그렇기 위해서는 '3'을 3하여 333으로 나오게 하고 30의 두번째 숫자인 0보다 333의 두번째 숫자인 3이 더 크게 해석되어 정렬하기 위해서이다.
왜 하필 *3 이었는가를 보자면 문제에서 numbers의 원소는 0이상 1000이하이기 때문에 최댓값을 생각하여 3을 곱해준 것이다.
처음 문제를 풀 때는 순열을 사용하여 풀었다. 하지만 실행 결과를 보면 알 수 있듯이 시간 초과로 틀렸다.
from itertools import permutations
def solution(numbers):
nums=len(numbers)
r=[]
res=list(permutations(numbers, nums))
for i in res:
a=''
for j in range(nums):
a+=str(i[j])
r.append(int(a))
r.sort(reverse=1)
return str(r[0])
다른 사람의 코드를 참고하여 내가 쓰고자 했던 코드를 함께 써보았다. 하지만 테스트 11을 통과하지 못했다.
def solution(numbers):
res=''
numbers_str=[str(num) for num in numbers]
numbers_str.sort(reverse=1, key=lambda num:num*3)
for i in range(len(numbers_str)):
res+=numbers_str[i]
return res
알아보니 만약 numbers=[0,0,0,0] 이라면 0 이 나와야 하는 경우를 생각해줘야 했다.
그리하여 아래 코드처럼 작성해줘야 한다.
str(int(''.join(numbers_str)))
join한 값을 int로 만들어 준 후 원하는 return값이 str이기 때문에 다시 str로 변환한다.
['0', '0', '0', '0']을 int로 바꿔주면서 0을 모두 합쳐주어 0000 즉 숫자 0이 된다.