[Python] 가장 큰 수 - 정렬

Saemi Min·2023년 2월 10일
0

Programmers Algorithm

목록 보기
11/29
post-thumbnail

문제

해당 문제 링크

풀이

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)))

Git - 소스 코드

결과

해석

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이 된다.

profile
I believe in myself.

0개의 댓글