평범한 필기장

[Programmers_Python] 가장 큰 수 본문

코딩 테스트 준비/Programmers

[Programmers_Python] 가장 큰 수

junseok-rh 2023. 4. 27. 13:15

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

 

프로그래머스

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

programmers.co.kr

내 풀이방식

 처음에 단순히 입력 값들을 string 형태로 바꾸고 그대로 정렬을 실시했다. 하지만 2번째 테스트 케이스를 보면 3, 30 ,34가

34, 3, 30으로 정렬이 되야하지만 사전형식으로 정렬을 하게 되면 34, 30, 3으로 정렬이 된다. 그래서 나는 좀 복잡하게 생각해서 풀었다.

def solution(numbers):
    numbers = list(map(str, numbers))
    numbers.sort(reverse = True)
    # print(numbers)
    for i in range(len(numbers)-1):
        if numbers[i][0] == numbers[i+1][0]:
            n = max(len(numbers[i]),len(numbers[i+1]))
            num1 = numbers[i]*n
            num2 = numbers[i+1]*n
            # print(num1,num2)
            # print(num1[:n], num2[:n])
            if num1[:n] < num2[:n]:
                num1 = numbers[i]
                num2 = numbers[i+1]
                numbers[i] = num2
                numbers[i+1] = num1
    # print(numbers)
    return ''.join(numbers)

정답 풀이

다른 사람들은 34, 3, 30을 어떻게 정렬을 했는지를 확인해봤는데, 조건이 1000이하의 정수이므로 입력값들의 길이를 3배로 늘려주고 그 늘려준 입력값들을 사전식으로 정렬하는 방식으로 간단히 푼 것을 확인했다. 그리고 입력이 [0,0,0,0]일 경우 0이 나와야하는 경우도 내가 생각을 못했다. 이 경우를 위해 join을 시킨 것을 정수로 바꾸고 그것을 다시 문자열로 변환해 준 것을 볼 수 있다.

def solution(numbers):
    numbers_str = [str(num) for num in numbers]                 
    numbers_str.sort(key=lambda num: num*3, reverse=True)       
    
    return str(int(''.join(numbers_str)))