가장 큰 수(python)

이민호·2021년 3월 23일

1. 내풀이

선택정렬을 이용하여 숫자 왼쪽부터 비교하며 정렬하려 했지만 실패하고 말았다...
그래서 결국 다른사람의 풀이를 참조하였다.

2. 다른사람 풀이

  1. 이렇게 짧은 코드로 할 수 있다는게 놀라웠다.
def solution(num): 
  num = list(map(str, num)) 
  num.sort(key = lambda x : x*3, reverse = True) 
  return str(int(''.join(num)))

풀이

  1. num의 요소들을 str로 만든다.
  2. 요소들(x)에 3을곱하여 최소한 백의 자리 수를 만든다.
    -> 요소들은 0~1000이라고 했으므로 적어도 세자리로 만들어 비교하는 것이다!!
    ex)
    num = [3, 30, 33, 35]
    -> [333, 303030, 333333, 353535]
    이렇게 하면 30보다 3이 먼저 올수 있게 가능해진다.
  3. 정렬된 num을 요소들을 합쳐준다.
    -> 이때 str과 int를 쓰는 이유가 모든숫자가 0일 경우를 위해 쓴다고 한다.(000되는 것을 방지하기 위해)
    그러나 이해가 가지 않는게 lambda x: x*3은 x에 3을 곱했을때를 기준으로 정렬하는 것이니
    실재로는 num요소들의 숫자에 반영되지 않는것이 아닌가??
    이 부분에 대해 아직 의문을 풀지 못했다...

다른사람 풀이 2

이번 풀이는 functools의 cmp기능을 이용했다.
cmp 라는 기능이 생소했는데 쉽게 말하면 어떤 두수(a,b)를 비교하는 함수를 만들고 대소를 비교해 a가 크면 양수를 반환하며 a를 뒤로 보내고, a가 작으면 음수를 반환하여 a를 앞으로 보낸다는 원리이다. a와 b가 같으면 0을 반환하여 움직이지 않는다.

예) n = [3,4,2,9,2]일때 cmp를 이용하여 오름차순으로 정렬

from functools import cmp_to_key
def comparator(a,b):
    print("a,b" , a,b)
    if a > b:
        return 1  # a값이 b보다 더크면 a를 앞으로 보냄.
    elif a < b:
        return -1 # b값이 더 크면 a를 뒤로 보냄.
    else:
        return 0 #같을시에는 움직이지 않음
print(sorted(n, key=cmp_to_key(comparator)))
#[2, 2, 3, 4, 9]

이를이용하여 풀어본다면 이렇게 된다.

import functools
def comparator(a,b):
    t1 = a+b
    t2 = b+a
    if t1 > t2:
    	return 1
    elif t1 < t2:
    	return -1
    else:
    	return 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
  1. t1, t2를 str상태에서 각각더한다.
    이유는 예를들어 30 과 3을 비교할때
    a= 3, b = 30이 되고, t1= 330이며 t2는 303이 되므로 t1이 더 크다 그러므로 a를 뒤로 보낸다.

  2. 오름차순으로 정렬되어 있으니 내림차순으로 다시 정렬한다.

profile
life is fun

0개의 댓글