호기심 많은 분석가
[프로그래머스] 정렬 - 가장 큰 수 (Python) 본문
코딩테스트 연습 - 가장 큰 수
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰
programmers.co.kr
def solution(numbers):
numbers = list(map(str, numbers))
numbers.sort(key=lambda x: x*3, reverse=True)
return str(int("".join(numbers)))
이번 문제의 풀이는 정말 경이롭다. 총 2가지의 실패를 경험하고 다른 분의 코드를 참고했다.
첫 번째는 str형태는 sort 해줬을 때 앞의 자리 수에 따라 하므로 str로 변환해준 뒤 sort 하고 join으로 합쳐줬다. 이 경우 30이 3보다 크게 나와서 2번째 케이스의 정답이 9534303으로 나오는 악재가 발생.
그래서 두 번째는 모든 경우의 수를 다루는 permutation을 사용했으나 역시 런타임 에러(시간 초과)가 발생. permutation의 경우 모든 케이스를 다루기 때문에 시간 초과가 안 뜨는걸 거의 보지 못했다. 그래서 어떻게 하면 이것을 줄일 수 있을까 하던 와중 경이로운 풀이를 발견. numbers의 원소가 0 이상 1,000 이하이므로 303이 330보다 작음을 밝히기 위해 x*3을 기준으로 정렬해준다. 그러면 333과 303이 되어 3이 더 큰 것을 밝혀낼 수가 있다.
다른 풀이로는 시간 복잡도가 O(logN)인 정렬을 구현하는 풀이가 있던데 둘 다 어렵다.
조건을 확인하고, 그것을 통해 활용할 수 있는 아이디어를 찾는 그 사고를 연습해보자. 결과에 int후 str을 적용하는 경우는 테스트 케이스가 ['0', '0', '0'] 일 때를 위해서이다. 실제로 제한 사항에서도 정답이 너무 클 수 있으니 문자열로 바꾸라는 것으로 보아 000이 아닌 0을 원함을 알 수 있다.
'Coding > Coding Test & Algorithm' 카테고리의 다른 글
[프로그래머스] 스택_큐 - 주식가격 (Python) (0) | 2021.06.28 |
---|---|
[프로그래머스] 정렬 - H-Index (0) | 2021.06.25 |
[프로그래머스] 정렬 - K번째수 (Python) (0) | 2021.06.25 |
[프로그래머스] 힙(heap) - 더 맵게 (Python) (0) | 2021.06.25 |
[프로그래머스] 스택_큐 - 다리를 지나는 트럭 (0) | 2021.06.24 |