알고리즘

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

deedee2 2024. 3. 31. 00:04
728x90

😄 아이디어

1. 문자열의 정렬방식 이해 필요 (가장 첫 글자부터 아스키코드로 변환해 비교)

2. _!number!_의 조건이 힌트 (1,000 이하) 👉 문자열을 최소 3회 이상 반복시키고 비교

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

😄 오답

# 오답!
from functools import cmp_to_key

def solution(numbers):
    nums = sorted(numbers,
                  key = cmp_to_key(getBigNum))
    
    #print('nums', nums)
    
    return str(int(''.join(map(str, nums))))

def getBigNum(x, y):
    if x == y:
        return 0
    
    sX = str(x); sY = str(y)
    
    maxIndex = max(len(sX), len(sY))
    
    if int(sX[0]) > int(sY[0]):
        return -1
    elif int(sX[0]) < int(sY[0]):
        return 1
    else:
        standard = str(max(x, y))
        for i in range(1, maxIndex):
            sXval = int(standard[0]); sYval = int(standard[0])
            
            if i < len(sX):
                sXval = int(sX[i])
            if i < len(sY):
                sYval = int(sY[i])

            
            if sXval > sYval:
                #print("x = " + str(x) + ", y = " + str(y) + ", sXval = " + str(sXval) + ", sYval = " + str(sYval) + " return -1")
                return -1
            elif sYval > sXval:
                #print("x = " + str(x) + ", y = " + str(y) + ", sXval = " + str(sXval) + ", sYval = " + str(sYval) + " return 1")
                return 1
        if len(str(x)) > len(str(y)):
            return -1
        else: 
            return 1

✔️ 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/42746#