minzzl

[프로그래머스] - 정렬. 가장큰수 본문

Algorithm/프로그래머스

[프로그래머스] - 정렬. 가장큰수

minzzl 2023. 4. 21. 10:23
728x90
반응형

안녕하세용

좋은 아침입니당

사실 이 문제는 스스로 풀지 못했습니다 ...

우선 문제부터 살펴보겠습니다.

문제

풀이

해당 문제에서 가장 어려웠던 점이, 가장 큰 자리 수가 같을 때, 어떻게 대소 비교를 하느냐였습니다.

 

예를들어,

[838,83] 과 [383,38] 이 입력 값으로 들어올 때를 가정해봅시다.

 

각 경우에서 만들 수 있는 가장 큰 수는 다음과 같습니다.

 

[838, 83] -> "83883"

 

[383, 38] -> "38383"

 

위와 같이 가장 큰 수를 만들기 위해, 어떠한 기준으로 수를 정렬해야할까요?

 

사실 정답은 간단했습니다.

 

일의 자리보다 큰 자리 수를 가진 수의 경우, 그 다음 자리수도 비교의 대상이 되도록 하면되는 것입니다.

 

이는, [383, 38] 이라는 수가 주어졌을 때,

 

맨 앞자리는 3으로 동일합니다.

그 다음 자리는 8로 동일합니다.

우리가 가장 큰 수를 만들기 위해 눈여겨 보아야할 것은 383의 마지막 남은 수인 "3"과 38의 마지막 남은 수인 "8"입니다. 

38의 "8이" 더 크기 때문에 숫자 조합시 더 큰수를 만들 수 있습니다.

 

따라서 우리는 비교하는 숫자들의 자리수를 맞추어 비교해야합니다.

 

38 > 383 838 > 83
38
383
838
83

 

이를 비교하기 위한 간단한 방법은, 우리가 임의로 자리수를 맞추어주는 것입니다.

문제의 number는 1000 이하의 수라고 했으니, 3자리 수일 것입니다.

따라서 우리는 numbers 를 문자열로 만든 후, 임의로 3을 곱해 3자리수로 만든 후 대소를 비교하면됩니다.

 

ex)

 

383838

383383383

 

나의 코드

 

from collections import deque 

def solution(numbers):
    answer = ''
    split_numbers = [ "" for _ in range(len(numbers))] 
    index = 0
    for i in numbers:
        split_numbers[index] = str(i)
        index +=1
    
    split_numbers = sorted(split_numbers,key=lambda x: int(x[0]),reverse= True)     
    split_numbers = sorted(split_numbers,key=lambda x: x*3, reverse= True)   
    for i in split_numbers:
        answer += i

    if answer.startswith("0"):
        answer = "0"
    
    return answer

print(solution([3, 30, 34, 5, 9]))
728x90
반응형