[프로그래머스 - 정렬] 가장 큰 수

    🔍문제

    문제 설명

    0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
    예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
    0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

    제한 사항

    numbers의 길이는 1 이상 100,000 이하입니다.

    numbers의 원소는 0 이상 1,000 이하입니다.
    정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다. 

    입출력 예

    numbers return
    [6, 10, 2] "6210"
    [3, 30, 34, 5, 9] "9534330"

     


     

    💡 풀이 과정

    원소를 숫자 하나씩 쪼개서(ex. 123이면 1, 2, 3으로 쪼갬) 큰 숫자부터 차례대로 배치하는 식으로 코드를 생각했다. 

    def solution(numbers):
        num_str = list(map(str,numbers))       
        num_str.sort(reverse=True)
        answer = ''.join(num_str)
        return answer

     

     💣 문제 발생:  비교가 잘못됨

    [3, 30, 34]라는 배열을 단순히 문자열 내림차순으로 정렬하면 [34, 3, 30]이 되지만,

    이를 이어 붙이면 34330 되기 때문에 테스트 결과에서 실패하는 결과가 나타났다.

     

    큰 숫자가 맨 앞에 오도록 정렬하기 위해 람다를 사용하였다.

     

    ✏️ 개념: 람다함수

     

    파이썬에서는 람다함수를 통해 이름이 없는 함수를 만들 수 있습니다.
    람다함수의 장점은 코드의 간결함 메모리의 절약이라고 생각할 수 있습니다.
    출처: 위키독스(https://wikidocs.net/22804

     

    sorted함수의 경우 key위치인자에 함수를 보내서, 함수에서 지장한 결괏값에 따라서 정렬을 할 수 있다.

    target = ['  cat ', ' tiger ', '    dog', 'snake   ']

    불필요한 공백을 제외한 문자의 길이로 정렬하기 위해, 람다함수를 사용한다.

    target = ['cat', 'tiger', 'dog', 'snake']
    print(sorted(target, key=lambda x : len(x.strip())))

     

     

    람다함수를 사용해서 숫자를 4번 반복하게 하였다. (원소는 0 이상 1000 이하이기 때문)

    예를 들자면 3과 30을 비교할 때, 3333과 3030이 되어 3333이 더 크게 비교되도록 만들었다.

    def solution(numbers):
        num_str = list(map(str,numbers))      
        num_str.sort(key=lambda x:x*4, reverse=True)
        answer = ''.join(num_str)
        return answer

     

     💣 문제 발생:  0의 출력 누락

    테스트 1, 2는 해결하였지만,

    000이면 0으로 출력해야 하지 않는 문제가 발생하였다.

     

    조건문을 추가하여 배열이 0으로 시작한다면 답은 0으로 출력하도록 코드를 수정하여 문제를 해결하였다. 

    def solution(numbers):
        num_str = list(map(str,numbers))      
        num_str.sort(key=lambda x:x*4, reverse=True)
    
        if num_str[0]=='0':
            answer='0'
        else:
            answer = ''.join(num_str)
            
        return answer

     

     


    🌟 최종 코드

    def solution(numbers):
        num_str = list(map(str,numbers))      
        num_str.sort(key=lambda x:x*4, reverse=True)
    
        if num_str[0]=='0':
            answer='0'
        else:
            answer = ''.join(num_str)
            
        return answer

    댓글