minzzl
[프로그래머스] - 정렬. 가장큰수 본문
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
반응형
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스] .dp - N으로 정수 표현 (0) | 2023.05.09 |
---|---|
[프로그래머스] -그리디. 가장큰수 (0) | 2023.05.03 |
[프로그래머스] - 정렬. K번째 수 (0) | 2023.04.20 |
[프로그래머스] - 스택/큐. 기능개발 (0) | 2023.03.06 |