본문 바로가기
Algorithm/프로그래머스

[프로그래머스] 가장 큰 수(level 2) 파이썬 문제 풀이

by daewooki 2021. 8. 27.
반응형

문제 링크: https://programmers.co.kr/learn/courses/30/lessons/42746

 

코딩테스트 연습 - 가장 큰 수

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰

programmers.co.kr

 

 

문제 해결 방법(시간 초과)

1. 먼저 리스트에 정수가 있으므로 문자형으로 바꾸어준다.

2. 모든 가능한 조합을 만든 후에 가장 큰 수를 출력한다.

 

from itertools import permutations
def solution(num):
    permute = list(permutations(num,len(num)))
    list_permute = [''.join(map(str,i)) for i in permute]
    answer = max(list_permute) 
    return answer

위의 방법은 매우 간단하게 생각할 수 있지만, 해당 방법은 시간 초과가 나므로 다른 방법을 생각해야했다. 

 

 

문제 해결 방법(통과)

1. 먼저 리스트에 정수가 있으므로 문자형으로 바꾸어준다.

2. 각 리스트의 원소에 3을 곱한 값으로 내림차순으로 정렬한다. (lambda 함수를 통해 실제 값을 바꾸지는 않음)

3. 다시 정수형으로 바꾸어 변환한 후에 문자형으로 변경하여 출력한다. 

 

 

코드

1
2
3
4
5
6
7
def solution(numbers):
    str_numbers = [str(_) for _ in numbers]
    str_numbers.sort(key=lambda num: num*3, reverse=True)
    
    answer = str(int(''.join(str_numbers)))
    return answer
 
cs

 

이번 문제의 Key Point

먼저, 3을 곱하는 이유는 2번째 예시를 보고 알아채야한다.
계산할 때 앞의 값을 보고 정렬을 한다면 [9, 5, 34, 30, 3] 이렇게 정렬된다. 하지만 더 큰 수가 되기 위해서는 3이 30보다 앞에 있어야한다. 


number는 최대 1000 이하의 숫자이므로 최대값을 생각해 3을 곱해주고, 3을 곱하게 되면 [999, 555, 343434, 303030, 333]이 되고, 정렬을 하게 되면 [999, 555, 343434, 333, 303030]이 된다. 

 

lambda 함수를 이용해서 정렬을 해주었고, 정렬된 숫자, "9534330" 을 출력해줄 수 있다. 

반응형

댓글