선택정렬을 이용하여 숫자 왼쪽부터 비교하며 정렬하려 했지만 실패하고 말았다...
그래서 결국 다른사람의 풀이를 참조하였다.
def solution(num): num = list(map(str, num)) num.sort(key = lambda x : x*3, reverse = True) return str(int(''.join(num)))
이번 풀이는 functools의 cmp기능을 이용했다.
cmp 라는 기능이 생소했는데 쉽게 말하면 어떤 두수(a,b)를 비교하는 함수를 만들고 대소를 비교해 a가 크면 양수를 반환하며 a를 뒤로 보내고, a가 작으면 음수를 반환하여 a를 앞으로 보낸다는 원리이다. a와 b가 같으면 0을 반환하여 움직이지 않는다.
예) n = [3,4,2,9,2]일때 cmp를 이용하여 오름차순으로 정렬
from functools import cmp_to_key def comparator(a,b): print("a,b" , a,b) if a > b: return 1 # a값이 b보다 더크면 a를 앞으로 보냄. elif a < b: return -1 # b값이 더 크면 a를 뒤로 보냄. else: return 0 #같을시에는 움직이지 않음 print(sorted(n, key=cmp_to_key(comparator))) #[2, 2, 3, 4, 9]
이를이용하여 풀어본다면 이렇게 된다.
import functools def comparator(a,b): t1 = a+b t2 = b+a if t1 > t2: return 1 elif t1 < t2: return -1 else: return 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
t1, t2를 str상태에서 각각더한다.
이유는 예를들어 30 과 3을 비교할때
a= 3, b = 30이 되고, t1= 330이며 t2는 303이 되므로 t1이 더 크다 그러므로 a를 뒤로 보낸다.
오름차순으로 정렬되어 있으니 내림차순으로 다시 정렬한다.