[프로그래머스-레벨2]가장 큰 수 - python

iamjinseo·2022년 9월 14일
0

문제풀이-Python

목록 보기
101/134
post-custom-banner

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

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

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

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

제한 사항

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

입출력 예

numbersreturn
[6, 10, 2]"6210"
[3, 30, 34, 5, 9]"9534330"

풀이

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

x*3은 왜 하냐고...?
사실..구글링 해버렸다..
참고 : https://huidea.tistory.com/4

2, 20, 200이 있다고 생각해보자.
가장 이상적인 수는 220200이다.

lambda에서 x*3으로 인해 '222', '202020', '200200200'이 비교된다.
그러면 아스키코드 순으로 정렬되는 문자열 정렬 방식에 의해 '222', '202020', '200200200' 순서대로 정렬된다.
그러면 '2' '20' '200' 순으로 정렬이 완료된다.


(해설을 짧게 해보았으나 사실 참고한 블로그에서 더 구체적이고 명확하게 설명해준다.)

결과

남의 코드

import functools

def comparator(a,b):
    t1 = a+b
    t2 = b+a
    return (int(t1) > int(t2)) - (int(t1) < int(t2)) #  t1이 크다면 1  // t2가 크다면 -1  //  같으면 0

def solution(numbers):
    n = [str(x) for x in numbers]
    n = sorted(n, key=functools.cmp_to_key(comparator),reverse=True)
    answer = str(int(''.join(n)))
    return answer

functoolscmp_to_key를 이용해 커스텀 비교 함수로 비교하는 방법도 있다.
나는 여기서 cmp_to_key라는 걸 처음 봤다..!! 자바의 Comparator가 생각나는 기술이다.

def comparator(a,b):
    t1 = a+b
    t2 = b+a
    return (int(t1) > int(t2)) - (int(t1) < int(t2)) #  t1이 크다면 1  // t2가 크다면 -1  //  같으면 0

1, 0, -1로 리턴되는 것은 알겠는데, 그 값을 리턴해서 어쩌자는 걸까?


return 음수 : 먼저 들어온 요소가 앞으로 정렬됨
return 0 : 바뀌지 않음
return 양수 : 나중에 들어온 요소가 앞으로 정렬됨(먼저들어온 요소보다 앞에 배치됨)
참고 : https://velog.io/@heyday_7/python-%EC%A1%B0%EA%B1%B4-%EC%A0%95%EB%A0%AC-%ED%95%98%EA%B8%B0-cmptokey


예를 들어 a가 6이고 b가 10이면 t1는 610, t2는 106이다.
610이 더 크니까 양수가 반환된다. 그러므로 a가 앞으로 정렬된다.

후기

이문제 너무 어려운듯ㅠㅠㅠㅠㅠㅠ 나는 x*3을 한다는 생각조차 못했고... cmp_to_key는 처음봄^^;;;;

그래도 앞으로 이런식의 정렬 문제가 나올 때 두가지 방법으로 대처할 수 있으니 긍정적으로 생각하도록 하자!

profile
일단 뭐라도 해보는 중
post-custom-banner

0개의 댓글