[프로그래머스] LEVEL 2 - 가장 큰 수(정렬)

곽호택·2021년 7월 25일
0

프로그래머스

목록 보기
2/4
post-thumbnail
post-custom-banner

! permutations 활용해서 테스트 케이스는 모두 통과 하였지만 제출할 때 시간초과가 나오면서 실패했다...

  • 문제 설명

    0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

    예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

    0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

  • 제한 사항
    numbers의 길이는 1 이상 100,000 이하입니다.

    numbers의 원소는 0 이상 1,000 이하입니다.

    정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.

다음 코드가 내가 작성한 코드이다.(시간초과)

from itertools import permutations

def solution(numbers):
    size = len(numbers)
    arr = list(permutations(numbers,size))
    number_list = []
    for i in arr:
        number = "".join(map(str, i))
        number_list.append(number)
    answer = max(number_list)
    return answer

위의 코드는 아무래도 permutations가 모든 경우의 수를 찾기 때문에 시간 초과가 나온 것 같다.

다른 분들이 작성한 코드를 찾아 봤는데 파이썬 정렬 라이브러리의 key를 활용하였다.

def solution(numbers):
	number = list(map(str, numbers)
    number.sort(key = lambda num : num * 3, reverse = True)
    
    return str(int(''.join(number)))
  1. 먼저 numbers 리스트의 값들을 str로 변환한 후 다시 list로 변환한다.

  2. number를 key를 기준으로 sort()를 사용하여 정렬한다.

  3. 이때 key로 lambda를 활용한다. num * 3을 한 이유는 제한 사항에서 원소가 1,000 이하이기 때문에 3자리 수로 맞춰서 비교하기 위함이다.
    이 부분을 이해하기 어려웠다.

  4. 문자열의 경우 ASCII 값으로 치환되어 정렬되기 때문에, 666, 101010, 222의 첫 번째 인덱스 값으로 비교한다고 한다.
    6 > 2 > 1의 순으로 정렬되어 오름차순으로 나타내면 [10, 2, 6] 이지만 reverse 파라미터를 활용해 [6, 2, 10]으로 뒤집었다.

  5. 마지막으로 int를 다시 str로 변환한다. 이유는 '000'을 처리하기 위해서이다.

key를 활용할 생각을 못했는데 좋은 공부가 되었다. 추가로 파이썬 람다에 대해서도 공부할 필요성을 느꼈다.

profile
잘하고싶다
post-custom-banner

0개의 댓글