[프로그래머스/Python] 정렬 Lv2 | 가장 큰 수

geunyeongii·2021년 12월 10일
0

접근방법

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))) #각 문자들을 붙여서 정수화 시킨 후 문자열로 반환

profile
✏️세상의 모든 기록 ✏️

0개의 댓글