일반적인 정렬로 풀려고 했다. 숫자로 비교해서는 당연히 안되고, 문자열로 바꿔서 정렬해도 되지 않는다. [3, 30, 34, 5, 9] 같은 경우 문자열로 바꾼다음 내림차순 정렬을 하면 "9534303"이 나온다. 답은 "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을 하면 x는 문자열이므로 문자열을 늘려주는 기능이다. [6, 10, 2]을 예시로 들면, numbers.sort(key=lambda x" x*3, reverse = True)를 하면,
[666, 101010, 222]가 되고 이를 정렬하면, [666, 222, 101010]이 되어서 결과적으로 [6, 2, 10]의 순서가 된다.
위와 같이 정렬되는 이유는 "문자열 비교연산의 경우엔 첫번째 인덱스인 666[0]인 6과 101010[0]인 1과 222[0]인 2를 ascii숫자로 바꿔서 비교합니다. 물론 같으면, 다음 인덱스도 비교합니다. 비교한 결과 [6, 2, 10]의 순으로 정렬됩니다."
즉, 앞자리가 큰 6 -> 2 -> 1순으로 정렬되어서 위와 같은 결과를 얻게 된 것입니다.
- 마지막에 int로 바꿔줬다고 str을 붙이는 이유는 [0,0,0,0,0]이 들어올 경우 0으로 만들어주기 위함이다.
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
For an ascending sort, return -1, 0, 1 for a < b, a = b and a > b