[Python] 프로그래머스 고득점 Kit 가장 큰 수
가장 큰 수 문제에 대해 풀이해 해보겠습니다.
문제 설명
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
5
def solution(numbers):
strNums = sorted(list(map(str, numbers)),key=lambda x: x*3, reverse=True)
if strNums[0] == '0':
return '0'
return ''.join(strNums)
- 숫자 리스트를 문자열 리스트로 변환
- map 함수를 이용하여 숫자 리스트를 문자열 리스트로 변환
- 정렬
x * 3
은 문자열을 세 번 반복하여 비교하는 방식reverse=True
를 사용하여 내림차순 정렬
- ‘0’ 처리
- 모든 숫자가
0
일 경우 결과가000..0
이 될 수 있으므로 첫 번째 값이'0'
이라면'0'
을 반환
- 모든 숫자가
- 결과 생성
- 정렬된 문자열 리스트를
''.join()
하여 리스트의 요소를 붙이고 반환
- 정렬된 문자열 리스트를
문제의 핵심
- 주어진 숫자 리스트에서 숫자를 이어 붙였을 때 가장 큰 수를 만드는 순서를 찾는 것이 문제의 핵심
문자열로 비교하는 이유?
- 숫자를 이어 붙여 비교해야 하므로,정렬 기준은 숫자가 아닌 문자열로 해야 함
- 숫자
6
과10
을 이어붙인 경우,610
과106
을 비교해야 함 - 숫자를 이어붙이는 경우는 숫자 자체가 아니라 이어붙인 순서에서 큰 수를 기준으로 정렬해야 하기 때문에 문자열로 변환하여 비교
- 숫자
*3
을 사용하는 이유?
- 이 문제에서 numbers의 원소는 0 이상 1,000 이하 라는 조건이 있기 때문
- 4자리 이하 모든 숫자를 비교하기 위해서 문자열을 3번만 반복해도 비교가 가능
numbers = [100, 1000, 9]
일 때:- 100 → 100100100
- 1000 → 100010001000
- 9 → 999
999
는100100100
보다 크기 때문에9
가 앞에 옵니다. 그리고100100100
과100010001000
을 비교하면,100100100
이 더 크기 때문에100
이1000
보다 앞에 옵니다. 즉, 결과는 [9, 100, 1000]으로 정렬됩니다.
*3
을 사용하는 이유는 숫자의 자릿수가 다를 때 자릿수 차이를 고려하여 비교 기준을 통일하기 위함- 예를들어,
34
와3
을 비교하면34
와3
는 문자열로 비교하면, 문자열 길이 때문에 제대로 비교를 할 수 없음
- 예를들어,
실행결과
1
2
3
채점 결과
정확성: 100.0
합계: 100.0 / 100.0
Github 바로가기
This post is licensed under CC BY 4.0 by the author.