[Python] functools.cmp_to_key(func)

2 분 소요


👩functools.cmp_to_key(func)?

  • sort(), sorted()와 같이 정렬 함수의 key에 함수(func)를 전달함으로써 함수의 결과값을 기준으로 정렬이 되게 한다.
  • func는 두 개의 인자를 받아 비교한다.

    🙄정렬 우선순위에 따라서 1(양수), 0 -1(음수)을 리턴하게 된다.

    • 첫 번째 인자 > 두 번째 인자 : 1 (or 양수)
    • 첫 번째 인자 = 두 번째 인자 : 0
    • 첫 번째 인자 < 두 번째 인자 : -1 (or 음수)


👩사용법

🙄리스트를 내림차순으로 정렬하고자 한다 가정하자.

from functools import cmp_to_key

# func에 해당되는 함수를 정의한다.
def compares(x, y):
    return y-x

def solution(numbers):
    numbers = [1, 2, 8, 5, 6, 7]
    numbers.sort(key = cmp_to_key(compares))
    print(numbers) #[8, 7, 6, 5, 2, 1]

🙄cmp_to_key를 사용하기 위해서는 functools에서 cmp_to_key를 import 해야 한다.

from functools import cmp_to_key

🙄 sort의 key에 cmp_to_key(func)을 지정해줌으로써 func의 결과를 기준으로 정렬이 될 수 있도록 한다.

numbers.sort(key = cmp_to_key(compares))

🙄func에 해당되는 compares의 경우 양수, 0, 음수 값을 반환할 수 있도록 정의한다.

  • 내림차순으로 정렬할 것이므로 값이 클수록 앞에 위치하도록 한다.
  • x = 2, y = 5일 경우, y-x가 3값을 가지게 되므로 2는 5보다 뒤에 위치하게 된다.
  • x = 3, y = 1일 경우, y-x가 -2이므로 3이 1보다 앞에 위치하게 된다.


👩예제 : 프로그래머스 “가장 큰 수”

🙋‍♀️문제

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.


🙋‍♀️제한 사항

  • numbers의 길이는 1 이상 100,000 이하입니다.
  • numbers의 원소는 0 이상 1,000 이하입니다.
  • 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.


🙋‍♀️입출력 예

numbers return
[6, 10, 2] “6210”
[3, 30, 34, 5, 9] “9534330”

🙋‍♀️풀이

🙄첫 번째 예를 살펴봐보자!

  • 6을 기준으로 10을 비교한다면 610 > 106이므로 6이 10보다 먼저 출력되어야 한다.
    • (1을 반환)
  • 6과 2의 경우, 62 > 26이므로 이 또한 6이 2보다 앞에 존재해야 한다.
    • (1을 반환)
  • 10과 2를 비교할 경우, 102 < 210이므로 2가 10보다 앞에 존재해야 한다.
    • (-1을 반환)

결론적으로 입력을 위 방식을 따라 정렬하게 되면 [6, 2, 10]이 된다.


이를 위에서 학습한 cmp_to_key를 통해서 풀이해보자!

from functools import cmp_to_key

def compares(x, y):
    tmp1 = int(x+y)
    tmp2 = int(y+x)
    return (tmp1 > tmp2) - (tmp1 < tmp2) # tmp1이 클 경우, 1 / 같을 경우, 0/ 작을 경우, -1 반환

def solution(numbers):
    numbers = list(map(str, numbers))
    numbers.sort(key = cmp_to_key(compares), reverse = True)
    return str(int(''.join(numbers)))
  • “0000…“의 경우, “0”으로 반환될 수 있도록 마지막에 int로 변환해준다.


이번 게시글은 여기서 마치도록 하겠다!

🙇‍♀️부족한 부분이 있다면 말씀해주세요! 감사합니다!


📃 참고

댓글남기기