비전공자 공부일기/:: ALGORITHM

[Solv:프로그래머스] 정렬 - 가장 큰 수 파이썬으로 풀기

와니_ 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지식, 알고리즘 지식이 한~참 부족한 쪼쪼렙
지금 단계에서 머리 싸맸다고 람다 함수를 알게됐을 것 같진 않았다.
이런 건 발상의 문제가 아니라 있는 것을 있는줄도 모르는 영역이기 때문에

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