나의 풀이
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']이 나오게 됨.
'Algorithms & CS' 카테고리의 다른 글
[Python] 프로그래머스 - 더 맵게 | heapq 동작 원리 (0) | 2021.08.12 |
---|---|
[Python] 프로그래머스 - 완주하지 못한 선수 (0) | 2021.08.10 |
동적계획법(Dynamic Programming) - 피보나치 숫자 (0) | 2020.11.12 |
[Javascript] 프로그래머스 - 위장 (0) | 2020.08.29 |
자바 메모리 구조 이해하기 - Stack, Heap (0) | 2019.07.30 |