Dev./Python

Python : functools.cmp_to_key()

Ivan'show 2023. 10. 17.
728x90
반응형
def compare(x, y):
    t1 = x + y
    t2 = y + x
    return (int(t1) > int(t2)) - (int(t1) < int(t2))  #  t1이 크다면 1, 작다면 -1, 같으면 0)
    

def solution(numbers):
    answer = ''

    n = [str(x) for x in numbers] # 리스트 컴프리헨션 문자 배열로 변환하여 n 에 저장
    print("before sorted: ", n)
    n = sorted(n, key=functools.cmp_to_key(compare), reverse=True)
    print("after sorted: ", n)
    answer = str(int(''.join(n)))

    return answer

# 예시 데이터 1
numbers1 = [6, 10, 2]
print(solution(numbers1))  # 출력: "6210"

# 예시 데이터 2
numbers2 = [3, 30, 34, 5, 9]
print(solution(numbers2))  # 출력: "9534330"

# 예시 데이터 3
numbers3 = [900, 9, 99]
print(solution(numbers3))  # 출력: "999900"
(venv) kimminhyeok@Ivans-Mac algorithm % python3 biggest.py
before sorted:  ['6', '10', '2']
after sorted:  ['6', '2', '10']
6210

before sorted:  ['3', '30', '34', '5', '9']
after sorted:  ['9', '5', '34', '3', '30']
9534330

before sorted:  ['900', '9', '99']
after sorted:  ['9', '99', '900']
999900

부분 부분 뜯어보기

def compare(x, y):
    t1 = x + y
    t2 = y + x
    return (int(t1) > int(t2)) - (int(t1) < int(t2))  #  t1이 크다면 1, 작다면 -1, 같으면 0)

"""
실제 동작 과정

compare 함수는 두 문자열 x와 y를 입력받아, 이를 이어붙여 두 가지 조합 t1과 t2를 만듭니다. 
그리고 이 두 조합을 숫자로 변환하여 비교합니다. 
t1이 더 크면 1, t2가 더 크면 -1, 두 값이 같으면 0을 반환합니다.

상세 설명
t1 = x + y: 입력받은 x와 y를 이어붙인 문자열을 만듭니다. 예를 들어, x="3", y="30"일 경우 t1="330"이 됩니다.
t2 = y + x: 입력받은 y와 x를 이어붙인 문자열을 만듭니다. 같은 예에서 t2="303"이 됩니다.
이어서 이 두 문자열을 정수로 변환합니다: int(t1)과 int(t2).
그 후 (int(t1) > int(t2)) - (int(t1) < int(t2))을 실행합니다. 이 부분은 다음과 같이 동작합니다:
int(t1) > int(t2)가 참이면, True가 되고 이는 정수 1로 취급됩니다.
int(t1) < int(t2)가 참이면, True가 되고 이는 정수 1로 취급됩니다.
둘 중 하나만 참이라면 결과는 1 - 0 = 1 또는 0 - 1 = -1이 됩니다.
둘 다 거짓이라면 결과는 0 - 0 = 0이 됩니다.
이렇게 계산한 값을 반환하면, 이 값이 이후의 정렬 로직에서 사용됩니다.

"""
n = sorted(n, key=functools.cmp_to_key(compare), reverse=True)

"""
실제 동작 과정

compare 함수는 두 문자열 a와 b를 받아 두가지 방법으로 조합하여 비교합니다.

a + b (예: '3' + '30' => '330')
b + a (예: '30' + '3' => '303')
예를 들어 a='3', b='30'일 때, '330'과 '303'을 비교합니다. 
'330'이 더 크기 때문에 a가 b보다 앞으로 가게 됩니다.

이제 sorted 함수에 key=functools.cmp_to_key(compare)를 적용하면 다음과 같이 정렬됩니다.

'30'과 '3' 비교: '330' > '303' → '3', '30'
'34'과 '3' 비교: '343' > '334' → '34', '3'
'5'과 '34' 비교: '534' > '345' → '5', '34'
'9'과 '5' 비교: '95' > '59' → '9', '5'
최종 정렬 결과는 ['9', '5', '34', '3', '30']이며, 이를 합치면 '9534330'이 됩니다.

이것이 functools.cmp_to_key(compare)가 어떻게 동작하는지에 대한 설명입니다.

"""

728x90
반응형

댓글