본문 바로가기
Algorithms & CS

[Python] 프로그래머스 - 가장 큰 수

by 고막고막 2021. 8. 9.

나의 풀이

from itertools import permutations
 
def solution(numbers):
    str_list = []
    int_list = list(permutations(numbers))
    for num in int_list:
        str_list.append("".join(map(str, num)))
    return str(sorted(map(int, str_list), reverse=True)[0])
cs

permutations를 사용해 리스트 요소들의 순열의 조합을 구한 후, 내림차순으로 정렬해 0번째 인덱스 값을 리턴하는 방법. 테스트 케이스는 모두 통과했으나, 정확성 테스트에서 시간초과로 실패!

 

다른 사람의 풀이

from functools import cmp_to_key 
 
def comparator(a,b):
    t1 = a+b
    t2 = b+a
    return (int(t1) > int(t2)) - (int(t1) < int(t2))
 
def solution(numbers):
    n = [str(x) for x in numbers]
    n = sorted(n, key=functools.cmp_to_key(comparator),reverse=True)
    # n = ['6', '2', '10'],  ['9', '5', '34', '3', '30']
    answer = str(int(''.join(n)))
    return answer
cs

나의 풀이에서 import 했던 itertools와 마찬가지로 함수형 프로그래밍 모듈에 해당하는 functools를 사용한 방법. comparator 함수를 선언해 두 값이 만들어내는 정수가 큰 순서대로 원소를 정렬해 그 자체를 문자열로 리턴한다.

functools.cmp_to_key(func)
: sorted와 같은 정렬 함수의 key 매개변수에 함수(func)를 전달할 때 사용하는 함수이다. 단, func 함수는 두 개의 인수를 받아들이고, 첫번째 인수를 기준으로 그들을 비교하여, 작으면 음수, 같으면 0, 크면 양수를 반환하는 비교 함수이어야 한다.

 

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

lambda식과 문자열 sorting을 활용한 방법. number의 원소는 0이상 1000이하의 숫자이기 때문에 문자형으로 변환한 리스트 원소에 *3을 하게 되면 ['666', '101010', '222']를 가지게 되고, 문자열 sorting시 각 원소의 0번째 인덱스의 ascii 값으로 비교하므로 결과는 ['6', '2', '10']이 나오게 됨.