문제 설명
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
제한 사항
- numbers의 길이는 1 이상 100,000 이하입니다.
- numbers의 원소는 0 이상 1,000 이하입니다.
- 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.
풀이
numbers 배열 내 있는 숫자들이 숫자의 정렬 기준이 아닌 string의 사전 순 정렬을 통해 큰 값이 우선되게 정렬을 해야하는 문제이다!
예를 들면, 9와 333을 비교했을 때, 숫자 정렬 기준이라면 9가 작지만, string 사전 순 정렬이라면, 9가 더 큰 값이 된다!
하지만, 이것만으로 문제를 해결할 수는 없고, 원소의 범위가 0이상 1000이하이므로, 3과 330을 문자열 비교했을 때, 첫 값인 3을 비교하면 330이 더 큰 값이 된다.
이는 틀린 풀이로 이어지게 되는데 3303 vs 3330을 비교하면 3이 더 큰 값으로 정렬되어야 맞는 값이 되기 때문이다!
그렇기에 문자열 정렬 시에 lambda 식을 사용하여 각 원소에 3을 곱해주어 333과 330330330을 비교하게 되면 문자열 2번째 인덱스인 333의 3과 330330330의 0을 비교하게 되어 3이 더 큰 값으로 정렬된다!
추가로 가장 큰 값이 0이라면 결국 0이기에 첫번째 인덱스의 값을 확인하여 0으로 리턴하는 것 또한 중요 포인트이다!
def solution(numbers):
answer = ''.join(sorted(list(map(str, numbers)), key=lambda x: x*3, reverse=True))
return '0' if answer[0] == '0' else answer
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] Lv2. 기능개발 (0) | 2024.10.17 |
---|---|
[프로그래머스] Lv1. 예산 (0) | 2024.10.17 |
[프로그래머스] 큰 수 만들기 (0) | 2024.10.01 |
[프로그래머스] 체육복 (0) | 2024.10.01 |
[프로그래머스] 완주하지 못한 선수 (1) | 2024.10.01 |