[프로그래머스] 가장 큰 수 Python

현지·2021년 9월 15일
0

프로그래머스

목록 보기
11/34

문제

https://programmers.co.kr/learn/courses/30/lessons/42746

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

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

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

제한 사항

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

입출력 예시

아이디어

  1. 입력을 문자열로 받아서 리스트로 변경한다.
  2. lambda를 이용하여 정렬하고 sum으로 합친다.
  3. join을 이용하여 이어서 출력한다.

[#Error 1]solution코드_python

:: 3, 34, 30인 경우, 34 3 30으로 정렬되어야 하는데 34 30 3으로 됨

def solution(numbers):
    for i in range(len(numbers)):
        numbers[i] = list(str(numbers[i]))
    numbers.sort(reverse = True, key = lambda x : (x[0]))
    numbers = sum(numbers, [])
    return ''.join(numbers)

[#Error 2]solution코드_python

:: 위의 문제를 해결한 줄 알았는데 너무 복잡하고 안됨

def solution(numbers):
    max_len = 0
    for i in range(len(numbers)):
        numbers[i] = list(str(numbers[i]))
        if max_len < len(numbers[i]):
            max_len = len(numbers[i])
    for i in range(len(numbers)):
        num = max_len - len(numbers[i])
        if num != 0:
            for j in range(num):
                numbers[i].append(numbers[i][-1])
                if j == num - 1:
                    numbers[i].append('+')
                    numbers[i].append(str(num))
    numbers.sort(reverse = True)

    for i in range(len(numbers)):
        if '+' in numbers[i]:
            del_num = int(numbers[i][-1])
            numbers[i] = numbers[i][:len(numbers[i])-2-del_num]
    numbers = sum(numbers, [])
    return ''.join(numbers)

[Clone]solution코드_python

:: lambda를 모르면 위처럼 고생한다. lambda공부하기!

lambda x: x*3 을 하는 이유는 1000이하의 숫자 이므로 3번 반복하여 비교하기 위함이다.
✅ex) 위의 예시처럼 3, 30, 34이면 333, 303030, 343434 이렇게 되고 앞부터 비교를 하면 34, 30, 3이 아닌 34, 3, 30순으로 정렬된다

def solution(numbers):
    numbers = list(map(str, numbers))
    numbers.sort(key=lambda x: x*3, reverse=True)
    return str(int(''.join(numbers)))

출처 : 프로그래머스 다른사람의 풀이

0개의 댓글