IT/알고리즘 / / 2023. 3. 26.

[파이썬 알고리즘 문제] 가장 큰 수

728x90
728x90

1. 정보


2. 접근 방법

  • 모든 경우의 수를 만드는 것은 시간 초과
  • 각 숫자를 비교해, 큰 숫자부터 집어 넣는 방식이 빠르다!!
    • 숫자 첫째 자리부터 비교, 만약 숫자가 같다면 길이가 짧은 요소부터 
    • ['2', '50']이 주어졌을 때, 자릿 수가 다른 두 숫자를 어떻게 비교할까?
      1. 마지막 자릿 수를 늘려 숫자를 맞춘다 (e.g., 52 → 5222 vs 5220)
      2. 첫째 자릿수를 늘린다 (e.g., 3 → 3333 vs 3020)
      3. 0을 붙인다 (e.g., 3 → 3000 vd 3020)
      4. 전체를 반복한다 (e.g., 30 → 3030 vs 3020)
  • 여러 개의 0으로 구성된 리스트가 들어올 때에는 0 하나만 반환되도록

3. 코드

# 코드를 더 줄여야 할 거 같은데... 🤔
def _len(num):  return len(str(num))
def _equalizeMaxLen(max_len, num):
    (full, remain) = divmod(max_len, _len(num))
    new_num = str(num) * full + str(num)[:remain] 
    return new_num

def solution(numbers):
    # 모든 값이 0인 케이스 고려
    if sum(numbers) == 0:   return '0'

    # 자릿수 맞추기 1
    max_len = len(str(max(numbers))) * 4

    # 자릿수 맞추기 2
    numbers = [(num,str(num)) if _len(num) == max_len else (num, _equalizeMaxLen(max_len, num))  for num in numbers]
    numbers = list(sorted(numbers, key=lambda tupl:tupl[1], reverse=True))
    numbers = [str(k) for k, num in numbers]
    return str(int(("").join(numbers)))
320x100
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유