풀이
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이 적용된다는 사실을 알게됐다. 그래서 람다식으로 문제 해결~
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 코딩테스트 고득점 Kit / 힙(Heap)] 더 맵게 (python) (0) | 2024.02.20 |
---|---|
[프로그래머스 코딩테스트 고득점 Kit / 정렬] H-Index (python) (0) | 2024.02.20 |
[프로그래머스 코딩테스트 고득점 Kit / 정렬] K번째수 (python) (0) | 2024.02.02 |
[프로그래머스 코딩테스트 고득점 Kit / 완전탐색] 모음사전 (python) (0) | 2024.01.28 |
[프로그래머스 코딩테스트 고득점 Kit / 완전탐색] 피로도 (python) (1) | 2024.01.24 |