https://school.programmers.co.kr/learn/courses/30/lessons/42746#
문제 설명
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
제한 사항
입출력 예
| numbers | return |
|---|---|
| [6, 10, 2] | "6210" |
| [3, 30, 34, 5, 9] | "9534330" |
def solution(numbers):
numbers = list(map(str, numbers))
numbers.sort(key=lambda x : x*3, reverse=True)
return str(int("".join(numbers)))
x*3은 왜 하냐고...?
사실..구글링 해버렸다..
참고 : https://huidea.tistory.com/4
2, 20, 200이 있다고 생각해보자.
가장 이상적인 수는 220200이다.
lambda에서 x*3으로 인해 '222', '202020', '200200200'이 비교된다.
그러면 아스키코드 순으로 정렬되는 문자열 정렬 방식에 의해 '222', '202020', '200200200' 순서대로 정렬된다.
그러면 '2' '20' '200' 순으로 정렬이 완료된다.
(해설을 짧게 해보았으나 사실 참고한 블로그에서 더 구체적이고 명확하게 설명해준다.)

import functools
def comparator(a,b):
t1 = a+b
t2 = b+a
return (int(t1) > int(t2)) - (int(t1) < int(t2)) # t1이 크다면 1 // t2가 크다면 -1 // 같으면 0
def solution(numbers):
n = [str(x) for x in numbers]
n = sorted(n, key=functools.cmp_to_key(comparator),reverse=True)
answer = str(int(''.join(n)))
return answer
functools의 cmp_to_key를 이용해 커스텀 비교 함수로 비교하는 방법도 있다.
나는 여기서 cmp_to_key라는 걸 처음 봤다..!! 자바의 Comparator가 생각나는 기술이다.
def comparator(a,b): t1 = a+b t2 = b+a return (int(t1) > int(t2)) - (int(t1) < int(t2)) # t1이 크다면 1 // t2가 크다면 -1 // 같으면 01, 0, -1로 리턴되는 것은 알겠는데, 그 값을 리턴해서 어쩌자는 걸까?
return 음수 : 먼저 들어온 요소가 앞으로 정렬됨
return 0 : 바뀌지 않음
return 양수 : 나중에 들어온 요소가 앞으로 정렬됨(먼저들어온 요소보다 앞에 배치됨)
참고 : https://velog.io/@heyday_7/python-%EC%A1%B0%EA%B1%B4-%EC%A0%95%EB%A0%AC-%ED%95%98%EA%B8%B0-cmptokey
예를 들어 a가 6이고 b가 10이면
t1는 610,t2는 106이다.
610이 더 크니까 양수가 반환된다. 그러므로 a가 앞으로 정렬된다.
이문제 너무 어려운듯ㅠㅠㅠㅠㅠㅠ 나는 x*3을 한다는 생각조차 못했고... cmp_to_key는 처음봄^^;;;;
그래도 앞으로 이런식의 정렬 문제가 나올 때 두가지 방법으로 대처할 수 있으니 긍정적으로 생각하도록 하자!