# 문제
# 문제 접근
주어진 정수를 이어 붙여서 가장 큰 수를 만들어 내야 한다.
얼핏 생각하기엔 가장 큰 수부터 이어붙이면 되지 않을까 라는 생각이 들지만 그렇게 하면 안된다.
예를 들어, 6과 10으로 만들 수 있는 가장 큰 수는 106이 아닌 610 이기 때문이다.
두 수를 이어 붙일 때 두 수의 크기를 비교하는 것이 아닌, 두 수를 이어붙였을 때 큰 수가 되어야 큰 수로 판별해야 되는 것이다.
예를 들어 a, b 두 수가 있다면 ab 와 ba를 비교한다. 그리고 ba가 더 크다면 리스트를 b, a로 정렬한다.
입력 예제인 [6, 10, 2] 로 예를 들어 보겠다.
1. 6 vs 10 : 610 > 106 이므로 [6, 10, 2]로 정렬된다.
2. 10 vs 2 : 102 < 210 이므로 [6, 2, 10] 로 정렬된다.
3. 6 vs 2 : 62 > 26 이므로 [6, 2, 10] 로 정렬된다.
이렇게 정렬된 숫자를 나란히 이어붙이면 6210이 되며 가장 큰 수가 된다.
# 문제 풀이
1. 두 수를 전달 받아 이어붙인 후 더 큰 수를 반환하는 compare 함수를 만든다.
2. numbers 를 위에서 정의한 compare 함수를 통해 비교하여 정렬하도록 한다.
3. 리스트의 모든 요소를 이어붙여 반환한다.
# 코드 작성
# sorted 함수에 커스텀한 compare 함수를 전달하기 위해 필요하다.
from functools import cmp_to_key
def solution(numbers):
# compare 함수를 통해 값을 비교하도록 전달하고 정렬한다.
# reverse가 True인 이유는 오름차순으로 정렬되기 때문에 내림차순으로 바꾸기 위해서이다.
sorted_number = sorted(numbers, key = cmp_to_key(compare), reverse = True)
# 정렬한 결과의 요소들은 int형이므로 str형으로 바꿔 리스트로 저장한다.
sorted_number = list(map(str, sorted_number))
# join 함수로 모든 요소를 이어붙인다.
answer = str(int(''.join(sorted_number)))
# 결과를 반환한다.
return answer
# 두 수를 이어붙여 비교 결과를 반환하는 함수다.
def compare(num1, num2) :
candidate1 = int(str(num1) + str(num2))
candidate2 = int(str(num2) + str(num1))
if candidate1 > candidate2 :
return 1
else :
return -1
* 본 문제의 출처는 프로그래머스(https://programmers.co.kr/) 입니다. 문제가 될 시 삭제하겠습니다.
반응형
'Algorithm > Programmers' 카테고리의 다른 글
[프로그래머스] 코딩테스트 고득점 Kit > 탑 (0) | 2020.03.18 |
---|---|
[프로그래머스] 코딩테스트 고득점 Kit > H-Index (0) | 2020.03.07 |
[프로그래머스] 코딩테스트 고득점 Kit > K번째수 (0) | 2020.03.07 |
[프로그래머스] 코딩테스트 고득점 Kit > 베스트앨범 (0) | 2019.11.05 |
[프로그래머스] 코딩테스트 고득점 Kit > 위장 (0) | 2019.11.05 |