from itertools import permutations
- itertools라이브러리를 사용하여 permutations로 모든 경우의 숫자 조합들을 확인하여 각 숫자들을 문자로 변환 하여 join후 다시 숫자로 변환해서 가장 큰 값을 도출해내고자 했습니다. 하지만 permutations를 사용하면 무수히 많은 조합들의 모든 경우의수를 뽑아야 하므로 비효율 적입니다. 아래와 같이 시간초과로 테스트에 통과하지 못하는 걸 확인했습니다.
from itertools import permutations as per
def solution(numbers):
result = list(per(numbers,len(numbers)))
findMax = []
for i in result :
findMax.append(''.join((map(str,i))))
return str(max(map(int,findMax)))
성능을 더 높이기 위해서 고민하다가 문자열로 정렬을 해보는 것을 고려해봤습니다.
정렬을 할 때 [3,30,34,5,9]
를 예로 들어 우선 이 숫자들을 사전순서대로 정렬을 취하면 [9,5,34,30,3]
이고, 이때 3이 30보다 앞에 와야하기 때문에 어떠한 과정을 거쳐주어야 했습니다. 이 숫자들은 모드 1000보다 작은 숫자이므로 모두 세자리 이상만 되게끔 만들기 위해서 각 문자열을 3배 하여 세개씩 붙여 만들어 줍니다. 3을 곱하여 주면 [999, 555, 343434, 303030, 333]
이렇게 될 것이고 이것을 정렬하면 [999, 555, 343434, 333, 303030]
가 됩니다.
그래서 최종적으로 30이 3보다 더 뒤에 갈 수 있기에 이 방법으로 코드를 구현하였습니다.
def solution(numbers):
numbers_str = [str(num) for num in numbers] # 사전순서로 정렬하기 위해 문자열로 변환
numbers_str.sort(key=lambda i: i*3, reverse=True) # 내림차순 정렬
return str(int(''.join(numbers_str))) #각 문자들을 붙여서 정수화 시킨 후 문자열로 반환
numbers_str.sort(key=lambda i: i*3, reverse=True)
sort의 키 값에 lamda를 활용한 코드
reference ▶ https://docs.python.org/3.8/library/stdtypes.html#list.sort
from itertools import permutations
모든 경우의 조합
reference ▶ https://docs.python.org/3.8/library/stdtypes.html#list.sort
https://docs.python.org/3.8/library/itertools.html#itertools.permutations