알고리즘/프로그래머스(lv2)

[프로그래머스/파이썬] 가장 큰 수 _ 풀이

룻밤 2025. 11. 15. 17:15

문제

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

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

 


풀이

문제의 제한사항을 유심히 봐야함.

numbers의 원소 값은 1000이하

 

그렇기 때문에 s*3 풀이법이 효율적

예를들어 문자열이 ["30", "3"]이 있다면

s*3을 적용하면 ["303030", "333"]이 된다.

 

문자열 비교는 사전식 비교라는 것을 알고 있어야함.

즉, 원래대로라면 "30" + "3" = "303" 이겠지만

s*3을 적용하고 비교한다면 "3"+ "30" = "330"이 된다.

(303030과 333에서 1번째 자릿수에서 0보다 3이 크기 때문)

해당 풀이법은 원소 값이 3자리까지 가능하기 때문이다.

 

또한 엣지 케이스로 비교해서 합친 문자열이 "00000"과 같을수 있기 때문에

0번째 문자열이 "0"이면 그냥 "0"으로 리턴

 

요약

1. 숫자 -> 문자열 변경

2. 각 문자열은 3번식 반복시켜서 내림차순 정렬 후 합침

3. 엣지케이스("0") 제외

 


소스코드

def solution(numbers):
    # 숫자는 문자열로 전환
    strnum = list(map(str, numbers))
    
    # 각 문자열은 3번 반복해서 나열하되 내림차순으로 정렬
    strnum.sort(key= lambda x: x*3, reverse=True)
    # 비교된 문자열을 빈칸 없이 합침
    answer = ''.join(strnum)
    
    # 첫번째 문자가 '0'이면 '0'만 반환
    if answer[0] == '0':
        return '0'
    return answer