[알고리즘 프로그래머스] 가장 큰 수 (LEVEL 2)

(문제) 가장 큰 수


0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

입력설명

입력으로 numbers 라는 리스트가 들어옵니다.

numbers의 길이는 1 이상 100,000 이하입니다.

numbers의 원소는 0 이상 1,000 이하입니다.

정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.

출력설명

순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성

테스트케이스

입력예제 출력예제
[6, 10, 2] 6210
[3, 30, 34, 5, 9] 9534330
[0, 0, 0, 0, 0] 0

해결방법

가장 큰 수를 만드려면 문자열 정렬을 하면 된다.

이때 numbers는 1000 이하 이기 때문에, 1의 자리 같은 경우 다른 것과 의도하는 것과 같게 비교하기 위해서 3개로 만들어서 정렬한다.

즉, 3, 30, 34, 5, 9 가 있을 경우 우선 문자열로 만들어서 문자열 내림차 순으로 정렬을 한다

그러면 9, 5, 34, 30, 3 이 된다. 이때 30과 3의 자리가 바뀌어서 나와야하는데 이것을 하기 위해서

999, 555, 343434, 303030, 333 이렇게 값을 변경한여 정렬을 한 순서대로 배치 시켜서 정렬한다.

그러면 9, 5, 34, 3, 30 이 된다.

이때 만약 0, 0, 0, 0 이 있을 수 있으니 한번 정수로 바꾸고 다시 문자열로 바꾸는 과정을 거친다.


코드

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

댓글남기기