Algorithm (Python, Java, SQL)/Programmers

[프로그래머스 고득점 Kit - 정렬] 가장 큰 수 (Python)

sanadoing_ 2023. 5. 22. 16:50
728x90

 

📖 문제 : 가장 큰 수 (Python)

 

 

문제 설명

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"

공지 - 2021 10 20 테스트케이스가 추가되었습니다.

 

 

 

내 코드

def solution(numbers):
    
    answer = ''
    temp = []
    numbers = list(map(str,numbers))
    
    for x in numbers:
         print( (x*4)[:4])

    numbers.sort(key=lambda x : (x*4)[:4], reverse = True)
    answer = ''.join(numbers)

    # 0이 여러개일 경우, '0' 반환
    if answer[0] == '0':
        return '0'
    else:
        return answer

 

 

Point ! ⭐️ 

  • numbers.sort(key=lambda x : (x*4)[:4]) : x를 네번 반복하고 반복한 값을 네자리까지 끊은 값들을 정렬
    예를 들어 numbsers 리스트에는 [1, 89, 5, 667] 값이 있다고 하면 
    [1, 29, 5, 667] 을 [1111, 89898989, 5555, 667667667667] 로 네번 반복한 뒤 [1111, 8989, 5555, 6676] 이렇게 자른 후 정렬 ! 그렇다고 원래의 리스트 numbers 함수가 바뀌는 것은 아니고 결국 [1, 89, 5, 667] 을 [1111, 8989, 5555, 6676] 이렇게 생각하여 [1111, 5555, 6767, 8989] 로 되어
    [1, 89, 5, 667] => [1, 5, 667, 89] 로 정렬되는 것 !



    이렇게 한 이유는 예시를 보면 이해가 될텐데
[3, 30, 34, 5, 9] "9534330"

 

  • 여기서 가장 앞의 자리 수만으로 높은거 먼저 해서 정렬한다고 하면 
    9534303으로 정렬된다. 30이 3보다 더 뒤에 정렬되어야 답이 나오는 것 !
    그래서 30을 3030으로 3을 3333으로 취급하여 내림차순으로 정렬해주면 답을 구할 수 있다.

 

 

프로그래머스

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

728x90