[프로그래머스-Sorting] 가장 큰 수

CHOI YUN HO·2021년 1월 16일
0

알고리즘 문제풀이

목록 보기
5/63

📃 문제 설명

가장 큰 수

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

예를 들어, 주어진 정수가 [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

[문제 출처 : 프로그래머스]

👨‍💻 해결 방법

나의 생각의 흐름을 주절주절..

정렬에 대해서 생각해볼 수 있는 좋은 문제라고 느꼈다.

주어진 정수로 만들 수 있는 가장 큰 수..
단순하게 정수의 대소관계를 비교해서는 해결할 수 없다.
(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
profile
가재같은 사람

0개의 댓글