정렬 문제 풀이

dandan·2026년 1월 26일

알고리즘

목록 보기
6/6

가장 큰 수

  • 0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수
  • 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210
  • 0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return

첫 번째 풀이

def solution(numbers):
    N = len(numbers)
    str_list = [str(i) for i in numbers]
    str_list.sort(reverse=True)
    
    for i, s in enumerate(str_list):
        if i == N-1:
            break
        if str_list[i+1] in s and len(str_list[i+1])<len(s):
            if int(s[len(str_list[i+1]):][0]) < int(str_list[i+1][0]):
                    str_list[i], str_list[i+1] = str_list[i+1], str_list[i]
                    
    return ''.join(str_list)

런타임 에러가 발생했다. 추측하기로는 str_list[i], str_list[i+1] = str_list[i+1], str_list[i] 해당 문법의 시간복잡도가 문제라고 생각이 들었다.


두 번째 풀이

from collections import deque

def solution(numbers):
    numbers.sort()
    str_list = [str(i) for i in numbers]
    match_digits = []
    for s in str_list:
        if len(s) == 1: 
            match_digits.append((s+"000", s))
        elif len(s) == 2: 
            match_digits.append((s+"00", s))
        elif len(s) == 3: 
            match_digits.append((s+"0", s))

    m = sorted(match_digits, key=lambda x :x[0], reverse=True)
    return ''.join([i[1] for i in m])
import functools

def cmpare(a, b):
	t1 = str(a) + str(b)
    t2 = str(b) + str(a)
    return (int(t1) > int(t2)) - (int(t1) < int(t2))
    
def solution(number):
	sorted_num = sorted(number, key = functools.cmp_to_key(lambda a, b : compare(a,b)), reverse=True)
    
answer = ''.join(str(x) for x in sorted_num)
return '0' if in(answer) == 0 else answer
def solution(N, num_list):
	str_list = [str(i) for i in num_list].sort()
    for i in range(0, N):
    	if str_list[i+1] in str_list[i]:
        	if int(str_list[i][len(str_list[i])-1:][0])>int(str_list[i+1][0]):
            	str_list[i], str_list[i+1] = str_list[i+1], str_list[i]
    return int(''.join(str_list))
profile
hustle

0개의 댓글