본문 바로가기

알고리즘/프로그래머스

[프로그래머스 코딩테스트 고득점 Kit / 정렬] 가장 큰 수 (python)

728x90

풀이

def solution(numbers):
    answer = ''
    strNumbers = sorted(map(str, numbers), key=lambda x : x*3, reverse=True)
    answer = ''.join(strNumbers)
    
    if int(answer) == 0:
        answer = "0"
    
    return answer

 

numbers 배열을 map을 사용하여 전부 str로 바꿔준다.

그리고 정렬을 하는데, 큰 수로 만들기 위해서는 내림차순 정렬을 해야한다. 따라서 reverse=True 조건을 사용한다.

내림차순 정렬만 적용하면 [3, 30, 33] 배열의 경우 [33, 30, 3] 이 나오는데 가장 큰 수가 되려면 [33, 3, 30]이 돼야한다. 따라서 람다식을 써서 조건을 더 추가해주었다. [33, 3, 30] 의 결과가 나오게 하기 위해서는 모든 원소의 자릿수를 맞춰주면된다. 현재 3을 제외한 두 원소는 두 자리 수이므로 3->33으로 바꿔주면 [33, 3, 30]으로 정렬이 가능하다. 주어진 문제에서 numbers 배열 안의 원소 크기는 0~1000까지 이므로 가장 작은 한자리수를 기준으로 하면, 원소를 x라고 했을 때 x*3을 해주면  0~1000사이의 모든 숫자를 동일한 기준으로 비교할 수 있다.

따라서 key=lambda x : x*3을 정렬조건에 추가하여 정렬한다. 이런식으로 정렬하면 [3, 30, 33]의 경우 각각 [333, 303030, 333333]이 되는데(x는 문자열이므로), 이를 내림차순 정렬하면 [333333, 333, 303030]이 되므로 최종적으로 [33, 3, 30]으로 정렬이 된다.

만약 배열이 [0, 0, 0]일 경우 정렬을 적용하여 답을 내면 "000"의 결과가 나온다. 우리가 원하는 답은 "0"이므로 0인 경우는 따로 체크하여 "0"을 반환할 수 있도록 한다.

 

 

 

처음에는 순열 재귀함수로 풀었는데 런타임 에러가 발생했다.

그래서 다시 풀었는데 그냥 내림차순 정렬만 하면 답이 안나와서 그 다음으로 나아가는 부분에서 애를 먹었다.

[3, 30, 33] 배열이 있을 때 큰 숫자를 만들기 위해서는 정렬 결과가 [33, 3, 30] 가 돼야하는데, 그냥 문자열 정렬 적용하면 [33, 30, 3]이 나오는게..

3과 같은 숫자를 3333.. 이런식으로 만들어서 비교하면 될 것 같긴한데, 바꾼 뒤에 다시 어떻게 되돌려야 하나 고민이 됐다. 그러던 찰나 람다식 써서 정렬할 때 정렬 기준으로 x: x*3 을 쓰면 실제 배열에는 x 원래 값 그대로 들어가고, 정렬할 때만 x*3이 적용된다는 사실을 알게됐다. 그래서 람다식으로 문제 해결~

반응형