Largest Number - LeetCode
문제 접근 🤔
- 전형적인 정렬 문제이나 하나의 키 값으로 정렬하는 문제가 아니었다. 어떤 키 값으로 정렬을 할지가 중요한 문제.
- 여기서 키 값은 비교할 두 원소를 문자열로 변환하여 더한 값이었다.
- 따라서 nums의 원소인 숫자들을 문자열로 변환하고
sorted 함수를 통해 이 리스트를 정렬하자.
- key 를
functools.cmp_to_key(compare) 로 설정하고 정렬의 기준을 정해줄 compare 함수를 선언한다.
compare 함수는 a + b > b + a 가 True 라면 -1, False라면 1을 반환하는 함수이다.
- 1이 반환되면 두 원소의 위치가 서로 바뀌기 때문에 주어진 조건에 맞게 정렬이 된다.
- 리턴 값을 str(int())로 감싸주는 이유는 입력값이 [0, 0] 일 때 00 이 아닌 0을 반환하기 위한 처리이다.
놓쳤던 부분 😅
- 효율적으로 작성하는 코드를 찾아보다가
functools 모듈의 cmp_to_key 함수를 알게 되었다.
cmp_to_key 를 활용하면 자신만의 조건에 따라 sorting 가능하게 할 수 있다.
functools.cmp_to_key(func) 는 sorted()와 같은 정렬 함수의 key 매개변수에 함수(func)를 전달할 때 사용하는 함수이다. 단, func() 함수는 두 개의 인수를 입력하여 그 둘을 비교하고 기준에 따라 음수, 0, 양수를 반환하는 비교 함수이어야 한다.
- 양수를 반환하면 두 입력의 자리를 바꾼다는 의미이고, 음수를 반환하면 위치를 바꾸지 않는다는 의미이다.
- 속도도 빠른 편인 것 같아서 정렬 문제를 풀 때 알아두면 유용하게 활용할 수 있을 듯.
코드 😁
파이썬 코드(37 ms)
from functools import cmp_to_key
class Solution:
def compare(self, a, b):
return -1 if a + b > b + a else 1
def largestNumber(self, nums: List[int]) -> str:
nums = sorted(list(map(str, nums)), key = cmp_to_key(self.compare))
return str(int("".join(nums)))