Post

[Python] 프로그래머스 고득점 Kit 가장 큰 수

가장 큰 수 문제에 대해 풀이해 해보겠습니다.

문제 설명

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

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

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

제한사항

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

입출력 예

numbersreturn
[6, 10, 2]“6210”
[3, 30, 34, 5, 9]“9534330”

풀이

1
2
3
4
5
def solution(numbers):
    strNums = sorted(list(map(str, numbers)),key=lambda x: x*3, reverse=True)
    if strNums[0] == '0':
        return '0'
    return ''.join(strNums)
  1. 숫자 리스트를 문자열 리스트로 변환
    • map 함수를 이용하여 숫자 리스트를 문자열 리스트로 변환
  2. 정렬
    • x * 3은 문자열을 세 번 반복하여 비교하는 방식
    • reverse=True를 사용하여 내림차순 정렬
  3. ‘0’ 처리
    • 모든 숫자가 0일 경우 결과가 000..0 이 될 수 있으므로 첫 번째 값이 '0' 이라면 '0'을 반환
  4. 결과 생성
    • 정렬된 문자열 리스트를 ''.join()하여 리스트의 요소를 붙이고 반환

문제의 핵심

  • 주어진 숫자 리스트에서 숫자를 이어 붙였을 때 가장 큰 수를 만드는 순서를 찾는 것이 문제의 핵심

문자열로 비교하는 이유?

  • 숫자를 이어 붙여 비교해야 하므로,정렬 기준은 숫자가 아닌 문자열로 해야 함
    • 숫자 610을 이어붙인 경우, 610106을 비교해야 함
    • 숫자를 이어붙이는 경우는 숫자 자체가 아니라 이어붙인 순서에서 큰 수를 기준으로 정렬해야 하기 때문에 문자열로 변환하여 비교

*3을 사용하는 이유?

  • 이 문제에서 numbers의 원소는 0 이상 1,000 이하 라는 조건이 있기 때문
    • 4자리 이하 모든 숫자를 비교하기 위해서 문자열을 3번만 반복해도 비교가 가능
    • numbers = [100, 1000, 9]일 때:
      • 100 → 100100100
      • 1000 → 100010001000
      • 9 → 999
      • 999100100100보다 크기 때문에 9가 앞에 옵니다. 그리고 100100100100010001000을 비교하면, 100100100이 더 크기 때문에 1001000보다 앞에 옵니다. 즉, 결과는 [9, 100, 1000]으로 정렬됩니다.
  • *3을 사용하는 이유는 숫자의 자릿수가 다를 때 자릿수 차이를 고려하여 비교 기준을 통일하기 위함
    • 예를들어, 343 을 비교하면
      • 343는 문자열로 비교하면, 문자열 길이 때문에 제대로 비교를 할 수 없음

실행결과

1
2
3
채점 결과
정확성: 100.0
합계: 100.0 / 100.0

Github 바로가기

This post is licensed under CC BY 4.0 by the author.