뭔가 정직하지 못한 방법을 사용 한 것 같은 죄책감... 이 살짝 들었지만 일단 성공적..ㅎ
로직
비교연산자를 다시 정렬해주고 소팅해서 해결했다.
비교연산자를 재정의 해줄 때, 두 인자를 두 가지 방식으로 (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)
ㅋㅋㅋㅋㅋㅋ
'코테 준비' 카테고리의 다른 글
[leetcode/python] Two Sum / Reverse Integer / Remove Duplicates from Sorted List (0) | 2021.01.13 |
---|---|
[프로그래머스/카카오 블라인드 테스트 2018/python] 추석트래픽 (0) | 2021.01.12 |
[프로그래머스/카카오 블라인드 테스트 2020/python] 자물쇠와 열쇠 (0) | 2021.01.08 |
[프로그래머스/python] 전화번호 목록 (0) | 2020.12.21 |
[백준 2887번 / python] 행성 터널 - 실패 (0) | 2020.12.21 |