프로그래머스 Level 2 | 가장 큰 수 | Python

tomkitcount·2025년 10월 2일

매일 알고리즘

목록 보기
194/302

https://school.programmers.co.kr/learn/courses/30/lessons/42746


문제 파악

numbers 라는 0또는 양의 점수가 담긴 배열을 입력받는다.
이 배열안에 숫자들의 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return하는 함수를 작성해야 한다.

예시

1) [6, 10, 2] -> "6210"
2) [3, 30, 34, 5, 9] -> "9534330"


해결 아이디어

처음엔 “그냥 수 자체를 내림차순 정렬하면 되지 않을까?”라고 생각하기 쉽다.
하지만 이러면 30 > 9라서 30이 앞에 오게 되고, 실제 이어붙인 값은 309…처럼 최댓값이 되지 않는 반례가 생긴다.

그래서 숫자를 문자열로 바꿔 비교하면 어떨까?
"9" vs "30"처럼 앞자리 크기가 바로 드러나서 어느 정도 해결된다.
하지만 30 vs 3처럼 앞자리가 같은 경우가 문제다.
이때는 "303" vs "330"처럼 서로를 이어붙인 결과(xy, yx)를 비교해야 올바른 순서를 정할 수 있다.
즉, 두 수 x, y를 문자열로 바꿔 x+y와 y+x 중 더 큰 쪽이 앞으로 오도록 정렬하면 된다.

그렇기에 핵심은 정렬 기준이다:

기본 수치 비교(X) → 문자열로 변환한 뒤 이어붙였을 때의 크기 비교(O)


이때 "3", "30", "34" 같은 문자열을 단순히 반복(*3)해서 길이를 늘려놓으면, 이어붙였을 때 비교 결과와 동일하게 정렬이 된다.

예시로 보자:

"3" 3 = "333"
"30"
3 = "303030"
"34" * 3 = "343434"

정렬하면 → "34" > "3" > "30"
→ 실제 이어붙였을 때도 "34", "3", "30" 순서가 최댓값을 만든다.


왜 하필 3번인가?

문제의 제약을 보면
numbers[i] ≤ 1000 → 최대 4자리 수

문자열을 충분히 반복하면 자리수 차이를 메꿔서 공정한 비교가 가능하다.

최대 4자리 수이므로,

2만 하면 "3"2="33", "30"*2="3030" → "33" vs "3030" 비교에서 "30"이 더 커 보이는 오판 가능

3이면 "333", "303030", "1000"3="100010001000" … 모두 자릿수 비교가 안정적으로 된다.

즉, 최대 자릿수(4)보다 크거나 같은 수로 반복해주면 안전하다.
그래서 3을 곱해준 것이고 , 곱하기 4를 해도 정답은 같다.

해답 및 풀이

def solution(numbers):
    # 1) 정렬 기준: 숫자를 문자열로 바꾸고 3번 반복한 값을 key로 사용 (내림차순)
    numbers = sorted(numbers, key=lambda x: str(x) * 3, reverse=True)

    # 2) 이어붙이기
    answer = ''.join(map(str, numbers))

    # 3) 모두 0인 경우는 "0" 반환 (예: [0,0,0] → "0")
    return answer if int(answer) != 0 else '0'
profile
To make it count

0개의 댓글