Algorithms & CS
[Python] 프로그래머스 - 가장 큰 수
고막고막
2021. 8. 9. 20:00
나의 풀이
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']이 나오게 됨.