[프로그래머스] 정렬: 가장 큰 수

"Sort"

Posted by Jaeuk on June 8, 2021

가장 큰 수

Reference - Programmers

문제 설명

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”

구현

1
2
3
4
def solution(numbers):
    numbers = list(map(str, numbers))
    numbers.sort(key=lambda x: x*3, reverse=True)
    return str(int(''.join(numbers)))

[가장 큰 수] 문제는 숫자를 문자열로 변환하고 변환된 문자열에 3을 곱해서 길이를 늘리고 문자열 비교로 정렬 후, 정답을 구하는 문제였다. 아마 내 말이 잘 이해가 되지 않을 것이다. 나 또한 이 문제를 풀면서 상당히 고생했다. 처음 문제를 접했을 때는 숫자를 어떻게 이어 붙이지? 부터 모든 인덱스별로 다양한 조합을 생성해야 겠다는 생각을 했었다. 하지만, 문제를 풀기 위해 시도할 수록 산으로 가는 느낌이었다. 결국 구글링을 통해 해답을 찾아 분석해보았다.

문자열 * 3? 이게 무슨 말일까. 도무지 이해가 가지 않았다. 코드를 차근차근 뜯어보니 조금 이해가 갔다. 우선 가장 큰 수를 만들기 위해서는 1~9 중 가장 큰 수가 앞에 오는 것이 맞다. 6, 10, 2 중에서는 6이 가장 크니 앞에 놓고, 2, 10을 순차적으로 놓으면 되겠지? 라는 생각으로 다음 입력을 봤더니 또 다른 문제에 직면한다.

330은 어떻게 구별해야 할까. 여기서 문자열에 3을 곱하는 이유를 찾을 수 있다. 333303030중 컴퓨터는 333을 더 큰 문자열로 인식한다. ABC > AAB와 같은 논리이다. 이것을 이해하고 마지막 return문을 보면 새로운 궁금증이 생긴다.

이미 문자열인 numbers리스트를 왜 다시 int로 변환하고 str로 변환하는가. 이해가 가지 않아

return ''.join(numbers)으로 제출해보았다. 결과는 마지막 테스트를 통과할 수 없었다. 문제는 '0000'이었다. 0000은 논리적으로 말이 안 되는 수다. 0이 되어야 한다. 0000을 0으로 만들기 위해 int로 변환 후, str로 재변환 시키는 것이다.