Codelog

[python] 프로그래머스_가장 큰 수 본문

Coding

[python] 프로그래머스_가장 큰 수

minzeros 2021. 10. 20. 17:13

문제 설명

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