[LeetCode] 179. Largest Number

Minji·2024년 1월 5일

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)))
profile
기록을 좋아하는 프론트엔드 개발자입니다.

0개의 댓글