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일때의 반례도 조건을 달아주면 된다
'알고리즘 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스] 석유 시추 (1) | 2025.02.14 |
|---|---|
| [프로그래머스] 옹알이 (1) (JS) 정규식RegExp (1) | 2025.01.31 |
| [프로그래머스] 롤케이크 자르기(Python) (0) | 2024.06.27 |
| [프로그래머스] 등굣길(Python) (0) | 2024.06.24 |