
Problem: 큰 수 만들기
처음엔 그냥 단순하게 내림차순으로 정렬하면 될 줄 알았다.
숫자가 한 자리일 경우에만 해당하는 거였다.
[1, 10] 같은 경우 110 > 101로 바로 반례가 나온다.
그러니 정렬 기준을 숫자가 아닌 문자열 형식으로 보기로 했다.
int(x + y)가 int(y + x)보다 크다면 x가 앞으로, 반대라면 y가 앞으로 오게 하면 된다.
이걸 구현하려면 정렬 함수들의 정렬 조건을 변경할 수 있는 key인자를 어떻게 잘 활용하면 될 것 같은데..
from functools import cmp_to_key
def cmp(x, y):
if x > y:
return 1
elif x < y:
return -1
else:
return 0
l = [5, 3, 4, 1, 2]
l.sort(key=cmp_to_key(cmp))
print(l)
해당 함수를 사용하면 sort 또는 sorted의 key인자에 함수를 넣어줄 수 있다.
인덱스 상으로 x가 y보다 뒤쪽으로 가려면 1, 반대면 -1
그리고 값이 같으면 0을 리턴하게 함수를 만들어 주면 된다.
from functools import cmp_to_key
input()
l = input().split()
l.sort(key=cmp_to_key(lambda x, y: -1 if int(x + y) > int(y + x) else 1))
print(0 if sum(map(int, l)) == 0 else "".join(l))
일단 첫 번째 입력은 필요 없으니 그냥 날려주고, 입력되는 수들을 int형으로 바꿀 필요 없이 문자열로 리스트에 저장해줬다.
key=cmp_to_key(lambda x, y: -1 if int(x + y) > int(y + x) else 1)
key에 들어갈 함수는 따로 선언해 줄 필요 없이 lambda식으로 한 줄에 해결했다.
맨 위에서 설명했던 규칙대로 정렬하는 것도 간단하게 구현이 된다.
print(0 if sum(map(int, l)) == 0 else "".join(l))
답이 0인 경우를 처리해줘야 하니 map과 sum을 이용해서 전부 더한 값을 확인해줬다.
아닐 경우 정렬된 리스트를 join함수로 결합해서 출력해주면 끝.
정렬 기준은 생각보다 많이 간단한 문제다.
파이썬으로 PS하면서 다시금 파이썬이 정말 편하다는 걸 자주 체감하는듯