Codelog
[python] 프로그래머스_가장 큰 수 본문
문제 설명
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
제한 사항- numbers의 길이는 1 이상 100,000 이하입니다.
- numbers의 원소는 0 이상 1,000 이하입니다.
- 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.
코드
# 프로그래머스 가장 큰 수
def solution(numbers):
numbers = list(map(str, numbers))
numbers.sort(key=lambda x:x*3, reverse=True)
answer = str(int(''.join(numbers)))
return answer
# 다른 방법
import functools
def solution2(numbers):
numbers = list(map(str, numbers))
numbers.sort(key=functools.cmp_to_key(comparator), reverse=True)
answer = str(int(''.join(numbers)))
return answer
def comparator(a, b):
n1 = int(a+b)
n2 = int(b+a)
return (n1 > n2) - (n1 < n2)
코드 설명
numbers 리스트를 문자열 리스트로 형 변환을 한다.
numbers의 각 원소는 0~1000 까지의 숫자이므로 최대 3자리의 수까지 있을 수 있다.
따라서 각 원소를 3자리로 만들어서 ASCII 값으로 비교해봐야하므로 3을 곱해준다.
각 원소를 3번 반복한 값끼리 비교한 뒤 내림차순으로 정렬해준다.
정렬된 리스트를 join 시켜주는데 모든 값이 0인 경우를 생각해서 int 형으로 변환한 뒤 다시 str 형으로 변환한다.
'000' -> 0 -> '0'
functools.cmp_to_key()
sorted와 같은 정렬 함수의 key 매개변수에 함수(func)를 전달할 때 사용하는 함수이다.
단, 전달할 함수는 두 개의 인수를 받아들이고, 첫번째 인수를 기준으로 그들을 비교하여,
작으면 음수, 같으면 0, 크면 양수를 반환하는 비교 함수이어야 한다.
따라서 comparator 함수는 a와 b를 비교했을 때, a가 b보다 작으면 음수(-1) 반환, 같으면 0 반환,
a가 b보다 크면 양수(1) 반환을 한다.
'Coding' 카테고리의 다른 글
[python] 프로그래머스_완주하지 못한 선수 (0) | 2022.02.18 |
---|