programmers.co.kr/learn/courses/30/lessons/42746?language=python3
import functools
def compare(a,b):
sum1, sum2 = int(a+b), int(b+a)
if sum1 > sum2: return 1
elif sum1 == sum2: return 0
elif sum1 < sum2: return -1
def solution(numbers):
answer = ''
numbers = list(map(str, numbers))
numbers.sort(key = functools.cmp_to_key(compare), reverse = True)
return str(int(''.join(numbers)))
먼저 numbers를 모든 요소를 문자열로 바꿔서 리스트로 저장합니다. 그 다음 가장 큰 수가 될 수 있도록 각 요소를 정렬해줍니다. 이 때 key를 따로 정의한 비교 함수(compare)로 주어 비교 함수에 의해 정렬되도록 합니다. compare함수는 연속된 문자열을 더하여 어느 순서로 더했을 때 더 큰 값이 되는지를 판단합니다. 그리고 가장 큰 수가 될 수 있도록 요소를 조합해야하기 때문에 내림차순으로 정렬합니다. 정렬이 끝나면 numbers의 모든 요소를 합한 값은 리턴해주면 되는데 이 때 중요한 것은 모든 요소를 합한 값을 int로 변환한 뒤 다시 str로 변환합니다. 이렇게 하는 이유는 예를 들어 numbers = [0,0,0,0] 일 때 모든 요소를 합한 값이 '0000' 가 되므로 int로 변환해서 0을 만들어준 후 다시 '0' 을 리턴해줍니다.
다른 사람의 풀이를 찾아보았는데 아래 코드처럼 엄청 간단하게 해결할 수 있는 방법이 있었습니다.
def solution(numbers):
answer = ''
numbers = list(map(str, numbers)) # numbers를 문자열 리스트로 변환
numbers.sort(key = lambda x : x*3, reverse = True) # 문자열 정렬
return str(int(''.join(numbers)))
여기서 key = lambda x: x*3 부분이 놀랐던 부분이었습니다. 이 부분은 x*3은 문자열을 3번 반복한다는 의미인데 numbers의 요소가 1000이하이므로 모두 3자리로 맞춰준다는 의미입니다. 어떻게 이런 생각을 할 수 있는지 신기했습니다.
- 배운 점 -
functools.cmp_to_key(함수명)
내가 원하는대로 비교할 수 있도록 정렬하고 싶을 때 비교함수를 key로 사용합니다. 비교함수에는 a와 b가 있을 때 a값이 더 크면 1, 값이 같으면 0, b값이 더 크면 -1을 반환하도록 정의해주면 됩니다. 내가 원하는대로 비교하고 싶을 때 유용하게 쓸 수 있는 방법인 것 같습니다. 다음 예시를 참고하면 도움이 될 것입니다.
from functools import cmp_to_key
def compare(x, y):
if(x[0] < y[0]): # x[0] 값이 y[0]값 보다 작으면
return 1 # y 내용을 앞으로 보냄
elif(x[0] > y[0]):
return -1
else: # x[0] 값이 y[0]값과 동일하면
if(x[1] < y[1]): # x[1]과 y[1]을 비교해서 y[1]이 크면
return -1 # x 내용을 앞으로 보냄
elif(x[1] > y[1]):
return 1
else:
return 0
sample = [[4,'c'], [10, 'b'], [13, 'b'], [1, 'd'], [10, 'a']]
print(sorted(sample, key=cmp_to_key(compare)))
# 출력: [[13, 'b'], [10, 'a'], [10, 'b'], [4, 'c'], [1, 'd']]
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스/Python] 문자열 압축 (0) | 2021.05.14 |
---|---|
[프로그래머스/Python] H-Index - Level2 (0) | 2021.05.12 |
[프로그래머스/Python] K번째수 - Level1 (0) | 2021.05.09 |
[프로그래머스/Python] 실패율 (0) | 2021.05.08 |
[프로그래머스/Python] 베스트앨범 - Level3 (0) | 2021.05.05 |