cmp_to_key / 커스텀 정렬자료구조+알고리즘2022. 5. 30. 06:44
Table of Contents
Why?
- 배열을 정렬할 때, 아래 문제처럼 원하는 기준으로 정렬을 하고 싶을 때가 있을 것이다!
- https://programmers.co.kr/learn/courses/30/lessons/42746
- 이러한 경우에 key에 단순한 lambda식을 넣어서 문제를 해결할 방법이 떠오르지 않는다!
사용법
- 커스텀 정렬을 하고 싶다면 아래처럼 cmp_to_key를 임포트한 후 커스텀 함수를 만들어서 리턴값을 조정한 후, sort나 sorted의 key에 넣어주면 된다!
from functools import cmp_to_key
def cmp(x, y):
return x-y
a = [1,3,2,5,2,4]
a.sort(key = cmp_to_key(cmp))
- 리턴값은 음수, 양수로 나눌 수 있다!
- return 음수 : 먼저 들어온 요소가 앞으로 정렬됨
- return 양수 : 나중에 들어온 요소가 앞으로 정렬됨
예시
수 정렬하기
- 배열을 오름차순으로 정렬하라!
- 사실 이러한 문제는 단순히 sort나 sorted를 사용하면 자동으로 정렬이 된다!
b = [1,3,2,5,2,4]
print(sorted(b))
# [1, 2, 2, 3, 4, 5]
- 하지만 커스텀 함수를 만들어서 return 값으로 정렬을 할 수 있다
- 아래의 예시를 통해 살펴보면 x가 y보다 클 때 양수를 리턴하므로 y를 앞으로 보내는 것이고 x가 y보다 작을 때 음수를 리턴하므로 x를 뒤로 보내는 것이다!
from functools import cmp_to_key
def cmp1(x, y):
if x > y:
return 1
elif x < y:
return -1
else:
return 0
b = [1,3,2,5,2,4]
print(sorted(b, key = cmp_to_key(cmp1)))
# [1, 2, 2, 3, 4, 5]
- 리턴 값이 어떻게 쓰이는지 안다면 이를 더욱더 간단하게 구현할 수 있다!
def cmp1(x, y):
return x-y
b = [1,3,2,5,2,4]
print(sorted(b, key = cmp_to_key(cmp1)))
- 람다식으로 한줄 표현도 가능하다!
print(sorted(b, key = cmp_to_key(lambda x,y : x-y)))
프로그래머스 - 가장 큰 수
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
- 문제를 풀 때 가장 중요한 아이디어는 문자열을 앞 뒤로 붙여서 정수로 변환할 때 가장 큰 순서대로 정렬을 하는 것이다
- [3, 30]이 있을 때, 330이 303보다 크므로 3을 30보다 앞에 배치!
- 파이썬 sort의 key에 간단한 람다식을 넣어서 문제를 해결할 수가 없다!
- 하지만 cmp_to_key를 이용해서 커스텀 함수를 넣어주거나 람다식을 넣어서 간단하게 해결할 수 있다!
from functools import cmp_to_key
def solution(numbers):
# 숫자를 문자열로 변환
str_numbers = list(map(str, numbers))
# 문자열을 붙여서 정수로 변환했을 때 큰 순서대로 정렬
str_numbers.sort(key = cmp_to_key(lambda x,y : int(y+x) - int(x+y)))
# 00이 나올 수도 있으므로 정수로 바꿨다가 문자열로 다시 바꿈!
return str(int("".join(str_numbers)))
'자료구조+알고리즘' 카테고리의 다른 글
플로이드-워셜 (0) | 2022.06.03 |
---|---|
우선순위 큐 다익스트라 (0) | 2022.05.31 |
이진 탐색 (0) | 2022.05.29 |
정렬 - quick, merge (0) | 2022.05.29 |
정렬 - bubble, selection, insertion (0) | 2022.05.27 |
@덕구공 :: Duck9s'
주니어 개발자에욤
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!