가장 큰 수
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 return [6, 10, 2] 6210 [3, 30, 34, 5, 9] 9534330
나의 생각의 흐름을 주절주절..
정렬에 대해서 생각해볼 수 있는 좋은 문제라고 느꼈다.
주어진 정수로 만들 수 있는 가장 큰 수..
단순하게 정수의 대소관계를 비교해서는 해결할 수 없다.
(10이 6보다 더 크지만, 10과 6으로 만들 수 있는 큰 수는 610)그래서 주어진 정수를 문자열로 바꾸어, 더한 다음 대소를 비교하는 방식으로 접근했다.
이 때 내가 원하는대로 정렬을 하기 위해 아래와 같이 compare함수를 정의해줬다.def compare(a, b): return (b + a > a + b) - (a + b > b + a)
그리고 sorted 함수의 key로 넣어주었다. (temp는 문자열로 이루어진 리스트)
import functools temp = sorted(temp, key=functools.cmp_to_key(compare))
compare함수 설명에 이런 표현이 맞을지는 모르겠지만
내가 이해하기 편한대로 설명해보자면,내가 원하는 정렬을 위해 위치를 바꿔야 하는 경우에는 1,
그대로 두고 싶은 경우에는 -1을 return하도록 한다.즉, 이 문제에서는 두 문자열 a, b가 주어졌을 때 a+b와 b+a를 비교하여
내림차순 정렬을 해야한다. 그래서 b+a가 a+b보다 클 때는 위치를 바꾸어 주어야
원하는대로 정렬이 된다. 즉 1을 리턴하도록 했다.결론
주어진 리스트는 정수로 이루어져 있기 때문에, 문자열로 변환해준다.
그 후 문자열을 어떤 순서로 더헀을 때 가장 큰 수가 되는지 고려하여
정렬을 진행한다.이 때, compare함수 정의하는 것을 잘 알아두면 종종 요긴하게 써먹을 것 같다.
정렬을 잘 진행했다면,
리스트에 저장되어 있는 순서대로 문자열을 합쳐주면
가장 큰 수가 된다.다만 주어진 리스트가 [0, 0, 0] 같은 경우에는
'000'이라는 값을 반환하게 되는데 이는 어색하기 때문에 0을 반환하도록 예외처리해주었다.
import functools def compare(a, b): return (b + a > a + b) - (a + b > b + a) def solution(numbers): answer = '' temp = [str(n) for n in numbers] temp = sorted(temp, key=functools.cmp_to_key(compare)) if temp[0] == '0': return '0' for s in temp: answer += s return answer