코딩테스트/python
[programmers/python] 정수를 이어 만들 수 있는 가장 큰 수 - 문자열 정렬
zyin
2025. 5. 25. 15:01
url : https://school.programmers.co.kr/learn/courses/30/lessons/42746
"가장 큰 수 만들기" 문제는 자주 등장하는 정렬 응용 문제이며, 문제의 겉모습은 간단하지만 내부에 숨겨진 비교 로직을 정확히 이해하는 것이 핵심이다.
문제 정의
0 또는 양의 정수가 담긴 배열 numbers가 주어졌을 때, 해당 수들을 조합하여 만들 수 있는 가장 큰 수를 문자열 형태로 반환하라.
예시:
numbers = [6, 10, 2]
# 만들 수 있는 조합 중 가장 큰 수: 6210
해결 아이디어
일반적인 정렬로는 해결할 수 없다. 왜냐하면, 단순히 수의 크기만 비교할 경우 [30, 3]과 같은 경우 30 > 3이므로 303이 만들어지지만, 실제로는 330이 더 크기 때문이다.
따라서 두 수 a, b를 비교할 때는 문자열로 바꾼 후 a+b와 b+a 중 어떤 조합이 더 큰지를 기준으로 정렬해야 한다.
핵심 구현
Python의 문자열 비교 특성을 활용하여 정렬 기준을 정의할 수 있다.
또한, 문제에서 주어진 수는 최대 1,000이므로 문자열을 3번 반복한 값을 기준으로 정렬해도 정렬 순서에 문제가 없다.
def solution(numbers):
numbers = list(map(str, numbers)) # 숫자를 문자열로 변환
numbers.sort(key=lambda x: x * 3, reverse=True) # 정렬 기준 정의
return str(int(''.join(numbers))) # '0000' 방지를 위해 int → str 재변환
테스트 예시
print(solution([6, 10, 2])) # "6210"
print(solution([3, 30, 34, 5, 9])) # "9534330"
print(solution([0, 0, 0])) # "0"
정리
- 두 숫자 a, b를 붙였을 때 ab와 ba 중 어떤 것이 더 큰지를 비교 기준으로 삼는다.
- Python의 sort 함수는 문자열 비교를 기반으로 정렬하므로, 문자열 반복으로 길이를 맞춰주면 비교가 가능하다.
- 최종 결과가 "000"처럼 될 수 있으므로, int()로 변환 후 str()로 다시 변환하면 "0"으로 정상화된다.