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
반응형
'Dev. > Python' 카테고리의 다른 글
Python: product, permutations (1) | 2023.10.21 |
---|---|
Python: enumerate, zip, sorted (0) | 2023.10.20 |
Python - Mini project : Library Management System 4 (0) | 2023.07.20 |
Python - Mini project : Library Management System 3 (0) | 2023.07.20 |
Python - Mini project : Library Management System 2 (0) | 2023.07.19 |
댓글