Today.dev

[PG_42746/Python] 가장 큰 수 본문

알고리즘/프로그래머스

[PG_42746/Python] 가장 큰 수

otu165 2021. 7. 3. 09:32

문제

42746번: 가장 큰 수

 

코딩테스트 연습 - 가장 큰 수

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰

programmers.co.kr

 


틀린 풀이

def solution(numbers):
    numbers = list(map(str, numbers))
    numbers.sort(key=lambda x: (len(x), -int(x)))  #1
    return ''.join(numbers)  #2

1. 리스트를 자릿수가 짧고 큰 숫자 순서로 정렬(#1)했는데 틀린 정렬 조건이다.

2. 리스트를 단순히 str로 합치는 코드(#2)는 "000"과 같은 출력을 만들 수 있다.

 

맞은 풀이

from functools import cmp_to_key


def comparator(s1, s2):  #1
    a = s1 + s2
    b = s2 + s1
    
    if a == b:
        return 0
    if a > b:
        return 1
    if a < b:
        return -1


def solution(numbers):
    numbers = list(map(str, numbers))
    numbers.sort(key=cmp_to_key(comparator), reverse=True)
    return str(int(''.join(numbers)))  #2

1. 정렬 기준을 lambda로 만들기 힘들다고 생각해서 Java처럼 comparator(#1)를 만들었다. 커스텀 함수를 정렬 기준으로 처음 제공해봤는데 key=comparator처럼 직접 함수를 제공하면 컴파일 에러가 발생했다. functools 모듈의 cmp_to_key 함수를 이용해야 한다. 

2. "000" 처럼 숫자로 옳지 않은 결과를 만들지 않기 위해 일부러 join의 결괏값을 정수로 변환한 후 다시 문자로 변환하는 과정(#2)을 거친다.

 

다른 풀이

# 1.
import functools

def comparator(a,b):
    t1 = a+b
    t2 = b+a
    return (int(t1) > int(t2)) - (int(t1) < int(t2)) #  t1이 크다면 1  // t2가 크다면 -1  //  같으면 0

def solution(numbers):
    n = [str(x) for x in numbers]
    n = sorted(n, key=functools.cmp_to_key(comparator),reverse=True)
    answer = str(int(''.join(n)))
    return answer

다른 사람의 풀이를 봤더니 유사한 풀이가 있었다. comparator 함수의 return 코드에서  1 = True, 0 = False 란 사실을 이용해서 위와 같은 코드를 작성하셨다. 

 

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

숫자의 최소 자릿수를 세 자릿수로 만들어서 비교하는 코드이다. 개인적으로 numbers 원소의 최댓값이 1,000 이기 때문에 4를 곱해야 하는 게 아닌가 생각했었는데, 어차피 네 자릿수는 1,000 하나밖에 없고 그마저도 0을 제외하면 우선순위가 최저라 3을 곱해도 괜찮은 것 같다.

 


참고

1. 다른 사람의 풀이

2. 파이썬 문서

 

 

Comments