[Python] functools.cmp_to_key(func)
👩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로 변환해준다.
이번 게시글은 여기서 마치도록 하겠다!
🙇♀️부족한 부분이 있다면 말씀해주세요! 감사합니다!
댓글남기기