코테 준비

[프로그래머스/python] 가장 큰 수

우디혜 2021. 1. 10. 20:45

 

뭔가 정직하지 못한 방법을 사용 한 것 같은 죄책감... 이 살짝 들었지만 일단 성공적..ㅎ

 

로직

비교연산자를 다시 정렬해주고 소팅해서 해결했다.

비교연산자를 재정의 해줄 때, 두 인자를 두 가지 방식으로 (A + B 혹은 B + A) 합쳤을 때 더 큰 수가 되는 경우를 기준으로 했다.

 

코드

from functools import cmp_to_key
def solution(numbers):
    answer = ''
    numbers = [str(num) for num in numbers]
    numbers.sort(key = cmp_to_key(compare))

    for num in numbers:
        answer += num

    return str(int(answer))

def compare(item1, item2):
    new_str1 = item1 + item2
    new_str2 = item2 + item1
    if new_str1 > new_str2:
        return -1
    elif new_str1 < new_str2:
        return 1
    else: return 0

 

새로 알게된 기능 혹은 방식

 

1. cmp_to_key

from functools import cmp_to_key

cpm_to_key를 사용하는 주 목적은 custom한 compare 기준을 만들어주기 위해서다

👉 stack overflow - Sort a list of lists with a custom compare function

 

 

cmp_to_key 함수의 내부를 보면 인자로 받아온 mycmp 함수를 가지고 K라는 클래스를 만들고 비교연산을 오버로딩해주고 K를 리턴해준다.

def cmp_to_key(mycmp):
    'Convert a cmp= function into a key= function'
    class K(object):
        def __init__(self, obj, *args):
            self.obj = obj
        def __lt__(self, other):
            return mycmp(self.obj, other.obj) < 0
        def __gt__(self, other):
            return mycmp(self.obj, other.obj) > 0
        def __eq__(self, other):
            return mycmp(self.obj, other.obj) == 0
        def __le__(self, other):
            return mycmp(self.obj, other.obj) <= 0
        def __ge__(self, other):
            return mycmp(self.obj, other.obj) >= 0
        def __ne__(self, other):
            return mycmp(self.obj, other.obj) != 0
    return K

물론 직접 비교연산자를 오버로딩할 수도 있지만, cpm_to_key에서 다 해준다...ㅎㅎ mycmp 부분에 오는 함수만 잘 정의하면 된다.

 

⁕ 자바에서는 Comparator<T> 인터페이스를 소팅해주고 싶은 대상 Class에 implementing 한 후 compare()를 정의해주면 된다.

stack overflow - Implementing custom compareTo

GeeksforGeeks - Comparator Interface in Java with Example

 

2. map() 활용

 

map을 활용하여 조금 더 깔끔한 방식으로 코드를 만들 수 있다.

# 내가 사용한 방식
numbers = [str(num) for num in numbers]
# map()을 사용한 방식
numbers = list(map(str, numbers))

3. boolean 사칙연산

 

내가 사용한 방식은 아래와 같다.

if new_str1 > new_str2:
    return -1
elif new_str1 < new_str2:
    return 1
else: return 0

근데.. 와우.. boolean 값이 계산(사칙연산)이 되는구나 파이썬은 

return (int(new_str1) > int(new_str2)) - (int(new_str1) < int(new_str2))

 

다른 방식

num의 각 자릿 수가 1000이하라는 점을 활용하여, num 에다가 *3을 한 후 바로 소팅해주었다. 천재들...😂😂 오늘 기준으로 977명이나 그런 방법을 사용했어..

numbers.sort(key=lambda x: x*3, reverse=True)

ㅋㅋㅋㅋㅋㅋ