문제 개요
양의 정수로 이루어진 리스트가 주어졌다고 가정해 봅시다. 이 리스트를 내림차순으로 정렬한 뒤, 모든 요소를 이어 붙여 하나의 문자열을 만들고, 그 결과를 반환하는 것이 목표입니다.
예를 들어 입력이 [415, 78, 954, 123, 5]라면, 출력은 954785415123이 됩니다.
해결 접근 방식
단순히 숫자의 크기대로 정렬한다고 해서 원하는 결과를 얻을 수 있는 것은 아닙니다. 어떤 두 수를 나란히 배치했을 때 더 큰 값이 되는지는 숫자 자체의 크기만으로는 판단하기 어렵기 때문입니다. 따라서 두 요소를 이어 붙인 결과를 서로 비교하는 사용자 정의 비교 함수가 필요합니다.
cmp(l, r)함수를 정의합니다. 이 함수는 두 요소 l과 r을 인자로 받습니다.int(str(l) + str(r))의 값이int(str(r) + str(l))의 값보다 크면 1을 반환합니다.- 그렇지 않으면 -1을 반환합니다.
- 이 비교 함수를 기준으로 리스트를 내림차순 정렬합니다.
- 정렬된 리스트의 모든 요소를 하나의 문자열로 연결한 뒤 반환합니다.
구현 예시
아래 코드를 통해 실제 동작 과정을 살펴보겠습니다.
from functools import cmp_to_key
def cmp(l, r):
if int(str(l) + str(r)) > int(str(r) + str(l)):
return 1
else:
return -1
def solve(input):
input.sort(key=cmp_to_key(cmp), reverse=True)
return "".join(map(str, input))
print(solve([415, 78, 954, 123, 5]))입력
[415, 78, 954, 123, 5]
출력
954785415123
코드 설명
- cmp_to_key: 파이썬 3부터는
sort()함수가 비교 함수(cmp)를 직접 받지 않기 때문에,functools.cmp_to_key를 사용해 비교 함수를 키 함수 형태로 변환해야 합니다. - reverse=True: 내림차순 정렬을 적용하기 위해 사용됩니다.
- "".join(map(str, input)): 정수 리스트의 각 요소를 문자열로 변환한 뒤, 공백 없이 하나로 이어 붙여 최종 결과를 만듭니다.