본문 바로가기
프로그래밍/알고리즘

[프로그래머스][Python] 가장 큰 수[정렬 - Level 2]

by 우주를놀라게하자 2022. 3. 11.
반응형
SMALL

[정렬]

태그 설명

정렬이란?

 

정렬이란 데이터의 집합을 어떠한 기준의 대소관계를 따져 일정한 순서로 줄지어 세우는것

문제

프로그래머스 문제 - 가장 큰 수 

링크: 가장 큰 수

 

문제설명

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
즉, 리스트 내부의 숫자를 이용하여 새로운 숫자들의 조합을 생성하고 가장 큰 수를 추출해내면 된다.


📃 소스코드 및 설명(시간 초과 코드)

from itertools import permutations
def solution(numbers):
    numbsers_str = []
    # 리스트 내부의 요소들의 조합을 생성한다
    result = list(permutations(numbers,len(numbers)))
    for i in result:
        new_str=''
        for j in i: # tuple class
            new_str += str(j)
        numbsers_str.append(int(new_str))
    
    return str(max(numbsers_str))

위의 방식으로 했을때는, 시간 초과가 나서 다시 시도! 

기존의 permutations를 사용하지 않는 방식으로 처리를 해야한다고 한다..(많은 사람들이 permutations를 사용해서 처리한거 같던데,,,)

 

결국 다른 아이디어가 없어서 다른 사람의 코드를 해석하기로 했다..

📃 소스코드 및 설명(통과 코드)

import functools
 
def comparator(a,b):
    # n에서 숫자 2개를 추출 후! 내 조건식에 대입해서 비교 후 a를 기준으로 정렬!
    # EX) a+b = 610, b+a = 106
    t1, t2 = a+b, b+a
    # 비교!
    print(f"comparator: {a},{b} -> {t1},{t2} -> {(int(t1) > int(t2)) - (int(t1) < int(t2))}")
    # 비교 후 크다: 1 ex) (5 > 4) - (5 < 4)
    # 비교 후 작다: -1 ex) (3 > 4) - (3 < 4)
    # 같다 : 0 ex) (4 > 4) - (4 < 4)

	#  t1이 크다면 1  // t2가 크다면 -1  //  같으면 0
    return (int(t1) > int(t2)) - (int(t1) < int(t2)) 
 
def solution(numbers):
    n = list(map(str, numbers))
    print(f'input -> {n}')
    # cmp_to_key 함수 사용하여 나만의 정렬 함수 생성!!
    # sorted의 key는 0,1,-1로 비교를 하기 때문에 comparator라는 함수를 통해서 비교를 
    n = sorted(n, key=functools.cmp_to_key(comparator),reverse=True)
    print(f'n -> {n}')
    answer = str(int(''.join(n)))
    return answer

 

 

 

반응형
LIST