가장 큰 수

bird.j·2021년 10월 12일
0

프로그래머스

목록 보기
51/53

프로그래머스

정수를 이어 붙여 만들 수 있는 가장 큰 수 구하기

  • 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
  • 0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
  • numbers의 길이는 1 이상 100,000 이하입니다.
  • numbers의 원소는 0 이상 1,000 이하입니다.
  • 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.

입출력

numbersreturn
[6, 10, 2]"6210"
[3, 30, 34, 5, 9]"9534330"


접근 방식

시도1. 순열로 가능한 모든 조합을 찾는다. 그 중 가장 큰 수를 리턴한다. ---> 시간 초과

시도2. 내림차순으로 정렬한 후 이를 이어 붙여 리턴한다.

실제 수는 3이 30보다 크지만, 문자열을 이어붙일 때는 303보다 330이 더 크기 때문에 3이 30보다 큰 순서로 정렬해야한다. 원소는 1000이하이기 때문에 같은 수를 세번 반복한 수와 비교를 해볼 수 있다. 또한 문자열에서의 수의 비교는 앞에서부터 비교하기 때문에 '333' > '303030'이다.

Edge Case

모든 원소가 0일 때
만약 [0, 0, 0, 0]이면 0을 리턴해야하는데 문자로 취급하여 이어붙이면 0000이 된다. 따라서 이를 정수형을 바꿔준 후 다시 문제의 조건에 따라 문자형으로 바꾼 결과를 최종 리턴하면 된다.



코드

def solution(numbers):
    nums = list(map(str, numbers))
    nums = sorted(nums, key=lambda x : x*3, reverse=True)
    return str(int(''.join(nums)))

0개의 댓글