[알고리즘] 프로그래머스 - 가장 큰 수

프로그래머스 - 가장 큰 수

일반적인 정렬로 풀려고 했다. 숫자로 비교해서는 당연히 안되고, 문자열로 바꿔서 정렬해도 되지 않는다. [3, 30, 34, 5, 9] 같은 경우 문자열로 바꾼다음 내림차순 정렬을 하면 "9534303"이 나온다. 답은 "9534330"이다.

다른 사람 풀이 1

def solution(numbers):
    numbers = list(map(str, numbers))
    numbers.sort(key = lambda x: x*3, reverse = True)

    return str(int(''.join(numbers)))
  1. x*3을 하면 x는 문자열이므로 문자열을 늘려주는 기능이다. [6, 10, 2]을 예시로 들면, numbers.sort(key=lambda x" x*3, reverse = True)를 하면,
    [666, 101010, 222]가 되고 이를 정렬하면, [666, 222, 101010]이 되어서 결과적으로 [6, 2, 10]의 순서가 된다.
    위와 같이 정렬되는 이유는 "문자열 비교연산의 경우엔 첫번째 인덱스인 666[0]인 6과 101010[0]인 1과 222[0]인 2를 ascii숫자로 바꿔서 비교합니다. 물론 같으면, 다음 인덱스도 비교합니다. 비교한 결과 [6, 2, 10]의 순으로 정렬됩니다."
    즉, 앞자리가 큰 6 -> 2 -> 1순으로 정렬되어서 위와 같은 결과를 얻게 된 것입니다.
  1. 마지막에 int로 바꿔줬다고 str을 붙이는 이유는 [0,0,0,0,0]이 들어올 경우 0으로 만들어주기 위함이다.

다른 사람 풀이 2

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

For an ascending sort, return -1, 0, 1 for a < b, a = b and a > b

좋은 웹페이지 즐겨찾기