# 1차 풀이(오답)
def solution(numbers):
answer = ''
str_num = []
for number in numbers:
str_num.append(str(number))
str_num.sort(key=lambda x : x[0] if x <=9 else (x[1] if 10 <= x <100 else x[2]) reverse=True)
answer = str(int("".join(str_num)))
# 000 과 같은 결과가 나올경우 '0' 으로 만들어 줘야하므로 int변환후 다시 str로 변환하였다.
return answer
문제를 어떻게 풀어야할지 방법은 금방 떠올랐지만 주어진 숫자 배열(numbers)을 원하는 조건대로 정렬하는 것이 쉽지 않았다. 숫자별로 가장 앞자리 수를 비교하고 가장 앞자리수가 같으면 두번째 자리수를 비교하는 식으로 하여 정렬해야 했다.
sort()함수의 key 값 설정시 if문으로 어떻게든 해보려했으나 실패하였다.
def solution(numbers):
answer = ''
str_num = list(map(str, numbers))
str_num.sort(key=lambda x : x * 3, reverse=True)
answer = str(int("".join(str_num)))
return answer
lambda x : x*3은 num 인자 각각의 문자열을 3번 반복한다는 뜻이다.
-> num의 인수값이 1000 이하이므로 3자리수로 맞춰서 비교하는 것이 의도이며 이 문제의 핵심이다.
이렇게 하는 이유에 대해서 설명해보자면, 문자열 비교는 ASCII 값으로 치환되어 정렬된다. 따라서 666, 101010, 222의 첫번째 인덱스 값으로 비교한다.
ASCII 코드 상, 6 = 86, 1 = 81, 2 = 82 이므로 6 > 2 > 1순으로 크다.
만약 numbers가 [221,2,10] 이렇게 주어졌다고 가정해보면 x*2를 하면 [221221,22,1010]가 되고, 이렇게 되면 22보다 221이 문자열 비교해도 더 큰수로 나오기 때문에 원하는 정렬이 되지 않는다. 따라서 1000이하의 조건이기때문에 x*3을 해줘야한다.
sort()의 기본 정렬 기준은 오름차순이므로,reverse = True
설정