ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Solv:프로그래머스] 정렬 - 가장 큰 수 파이썬으로 풀기
    비전공자 공부일기/:: ALGORITHM 2021. 10. 11. 13:18
    문제설명

    0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

    예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

    0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

    제한 사항

    • numbers의 길이는 1 이상 100,000 이하입니다.
    • numbers의 원소는 0 이상 1,000 이하입니다.
    • 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.

     

    내가 작성했던 의사코드

    ** keypoint **
    1) 맨 앞자리 수가 가장 큰 순서대로 정렬한다
    2) 맨 앞자리 수가 같은 경우, 그 다음자리 수를 비교한다. 이를 반복한다.
    3) 순서대로 answer에 이어붙인다

    그런데 1), 2), 3)를 구현하는 게 너무 빡셌다.
    머리를 싸매다가 생각난 하나의 아이디어....

    '어...? 이거 다 String으로 만들어주고 정렬하면 자동으로 되잖아?

    그렇다. 문자열일 때의 크기비교는 150 < 92 이므로,
    문자열로 바꿔주고 정렬시키면 저거 다~ 해결되는 거였음

    그러고 나서 룰루랄라 제출 돌렸더니
    테스트 케이스에서 막히는 게 있었음
    "만약 한 자리 수의 경우, 비교할 대상의 두 번째 자리의 수가 첫 번째 자리 수보다 작다면 한 자리 수가 더 앞 순서다"

    두구둥.... 요거 어케풀지 하다가
    화니가 아 이거 ?!?!? 넘버 이용하는거네 하고 알려줌
    지금 상태로 비교하면 명확하지 않은 부분이 있으니
    같은 수를 3번 반복한 형태로 치환한 후 비교해주는 것

    그런데 소스구현 어케할지 막막해서
    이번에는 치트키 써서 해답 보기로 함

    보길 잘했음. 내가 잘 몰랐던 람다함수 이용해야 했었음

    def solution(numbers):
        answer = ''
        
        numbers = list(map(str, numbers))
        numbers.sort(key = lambda x:x*3, reverse = True)
        answer = str(int(''.join(numbers)))
    
        return answer

     

    음... 일단 string으로 바꿔놓고 비교해주는 나의 아이디어가 맞았다는 거에
    스스로에 대한 치얼스를 한번 해주고(개쪼렙 레벨임 ㅋㅋㅋㅋㅋ)
    일단 하나 배워간다.

     

    참 주말에 화니와 나의 공부방법에 대한 견해차이가 있었음.

    화니는 막히는 모~든 부분을 스스로 뚫어가면서 배워나가는 타입이었고
    나는 시도할 만큼 해본 뒤 안 되는 부분은 검색 등으로 해결해봐야 할 필요도 있다고 주장

    그런데 일단 화니는 컴공 석사고; 나는 CS지식, 알고리즘 지식이 한~참 부족한 쪼쪼렙
    지금 단계에서 머리 싸맸다고 람다 함수를 알게됐을 것 같진 않았다.
    이런 건 발상의 문제가 아니라 있는 것을 있는줄도 모르는 영역이기 때문에

    무튼 나는 내 방식대로 간다.
    그래도 도움주는 화니님 감사합니다.

    댓글

coding wanee