알고리즘/프로그래머스

[프로그래머스] 가장 큰 수 (Python) lambda, sorted functool.cmp_to_key

Jinoo.keem 2025. 2. 6. 18:07
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/42746

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

사실 못풀었다. lambda 사용법을 까먹어서 사용법을 찾아보고,

알았더라도 트릭으로 푼 문제라서 다른 풀이법을 찾아봤는데 그것도차 처음보는거라서 공부가 필요했다.

def solution(numbers):
    numbers = list(map(str, numbers))
    numbers.sort(key=lambda x: x*3, reverse=True)
    result = ''.join(numbers)

    return result if result[0] != '0' else '0'

 

기존 풀이는 1000이하의 숫자를 비교하기위해 x*3을 기준으로 비교하는 트릭을 썼다.

근데 다른 분들의 풀이를 보니 functools.cmp_to_key를 사용하길래 알아보기로 했다.

from functools import cmp_to_key

def solution(numbers):
    def compare(a, b):
        # 두 수를 이어붙였을 때 어느 순서가 더 큰지 직접 비교
        t1 = str(a) + str(b)
        t2 = str(b) + str(a)
        return int(t2) - int(t1)  # t2가 크면 양수, t1이 크면 음수 반환
    
    # cmp_to_key를 사용해 정렬
    numbers = sorted(numbers, key=cmp_to_key(compare))
    answer = ''.join(map(str, numbers))
    
    return answer if answer[0] != '0' else '0'

sorted를 사용할 때, key값에 따라 기준점을 다르게 정렬할 수 있다.

ex : abs(절대값), len(길이), cmp_to_key(func) 등 ..

cmp_to_key(비교함수)는 비교 함수를 키 함수로 변환해주는 도구로 이해하면 된다.

 

위 코드에서는 두 수를 이어붙였을 때 더 큰 순서를 찾는 compare 함수를 key로 설정했다.

compare(a, b)는 int(str(b) + str(a)) - int(str(a) + str(b)) 를 반환하여, 두 수를 서로 다른 순서로 이어붙였을 때 더 큰 조합이 앞으로 오도록 한다. sorted(numbers, key=cmp_to_key(compare))를 수행하면, compare(a, b)의 반환값이 양수이면 b가 a보다 앞에 와야하고, 음수이면 a가 앞에 유지되도록 정렬된다.

 

마지막으로, numbers 가 전부 0일때의 반례도 조건을 달아주면 된다