[프로그래머스] 가장 큰수 🐳 (Python) / level2 / 정렬

반응형

Programmers Logo

 

 

Contents

     


     

    1.  문제🔥

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

    문제

    요약하자면, 숫자 배열이 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 리턴해야 합니다.

    1) 예제 입출력❄️

    입출력 예시

    첫 번째 예시를 보면, [6, 10, 2]에 대해 [6102, 6210, 1062, 1026, 2610, 2106]와 같은 조합을 만들 수 있고 가장 큰 수는 6210입니다. 이를 문자열 "6210"으로 리턴해야 합니다.

    2. 핵심 논리☢️

    숫자는 큰수가큰 수가 앞에 나와야 합니다. 하지만 3과 31중에 31보다 3이 앞에 나와야 더 큰 수가 됩니다. 313보다 331이 더 크기 때문입니다. 즉, 3과 31을 비교할 때는 33과 31을 비교해야 합니다. 근데 문자열은 사전 순으로 비교가 되고, 입력되는 수는 0 이상 1000 이하입니다. 즉, 3과 31을 비교할 때, "333"과 "313131"을 사전 순으로 비교하면 "333"이 더 뒤에 나오게 되며, 더 큽니다. 즉, 문자열을 3번 반복해서 비교하게 되면, 3 자릿수까지는 사전 순으로 비교가 가능해집니다. 이게 핵심 원리입니다.

    3. 풀이 코드

    def solution(numbers):    
        s = list(map(str,numbers))
        a = sorted(s,key=lambda x: x*3,reverse=1)
        return str(int("".join(a)))

    먼저 주어진 숫자 리스트 numbers를 문자열 리스트 s로 바꿔줍니다. 그리고 정렬을 해주는데, key=lambda x: x*3을 이용해 역순으로 정렬해 줍니다. 이는 "3""32"의 비교에서 "333"과 "323232"의 비교를 역순으로 하는 것입니다. 사전 순으로 따지면 "333"이 뒤에 나오며, 역순이니 앞에 나오게 됩니다. 즉, 정렬 결과 a는 더 큰 숫자 문자열이 앞에 나오는 내림차순으로 정렬됩니다. 여기서 문자열 리스트를 join 해서 int로 바꾸고 str 취해서 반환합니다. 여기서 int로 바꾸고 str로 변환하는 이유는 a에 ["0", "0"]에 대해 int를 취해주지 않으면 "00"으로 반환됩니다. 문제는 이를 "0"으로 반환하고 싶으므로 str(int("00")) 이렇게 하면, "0"으로 반환됩니다.

     

    읽어주셔서 감사합니다.

    다음에 더욱 유익한 글로 찾아오겠습니다.

     

    * 관련 풀이 코드는 아래 깃허브 링크에 있습니다.

    https://github.com/netsus/Programmers/blob/1c58c053092a4b6512cd5f0c41aa41ef465f465f/Level2_%EA%B0%80%EC%9E%A5_%ED%81%B0%EC%88%98.ipynb

     

    GitHub - netsus/Programmers: Programmers algorithm test code

    Programmers algorithm test code. Contribute to netsus/Programmers development by creating an account on GitHub.

    github.com

     

     

    Reference)
    1. Programmers Logo: https://programmers.co.kr/
    반응형

    댓글

    Designed by JB FACTORY