본문 바로가기
프로그래머스/고득점 Kit

[프로그래머스] 가장 큰 수 - Python / 파이썬

by yewonnie 2023. 3. 15.

문제 설명 

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

제한 사항 

- numbers의 길이는 1 이상 100,000 이하입니다.
- numbers의 원소는 0 이상 1,000 이하입니다.
- 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.

입출력 예 

numbers return
[6, 10, 2] "6210"
[3, 30, 34, 5, 9] "9534330"

문제 풀이 

가장 큰 수 문제는 문제를 해결하는 아이디어를 떠올리는 것이 정말 어려웠다. 

주어진 정수가 있을 때 가장 큰 수를 알아내기 위해서는 

수의 길이를 맞춰주어야 한다. 

이때, 문제 조건에서 numbers의 원소는 1000이하라고 했으므로 

원소의 길이는 최소 1이므로 길이를 맞춰주기 위해 모두 3을 곱해준다. 

 

666, 101010, 222 이렇게 세 수가 있다고 할 때 

문자열은 앞에서부터 비교하여 큰 수를 판단하므로 

6210이 가장 큰 수가 된다. 

 

333, 303030, 343434, 555, 999 일 때는 

9534330이 가장 큰 수가 된다. 

 

즉, 가장 큰 수를 찾기 위해서는 문자열의 앞의 원소부터 차례로 비교해서

가장 큰 수를 찾으므로 길이를 모두 동일하게 맞춰주고 비교하면 가장 큰 수를 찾을 수 있는 것이다. 

 

따라서 먼저 모두 문자열로 만들어준 뒤 길이를 맞춰 내림차순으로 정렬해주고 

하나로 합친 최종 문자열을 얻을 수 있었다. 

이때, int로 바꿔준 뒤 다시 str로 바꿔주는 이유는 

000과 같은 문자열이 있을 때 0으로 만들어줘야하기 때문이다. 

이 마지막 조건을 생각하는 데에도 어려움이 있었던 것 같다. 


My Code

def solution(numbers):
    answer = ''
    
    numbers = [str(i) for i in numbers]
    numbers.sort(key = lambda x: x*3, reverse = True)
    answer = str(int(''.join(numbers)))
    
    return answer

댓글