[알고리즘 프로그래머스] 가장 큰 수 (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))))
댓글남기기