프로그래머스 고득점 kit 정렬 파트에 있는 문제다.
https://programmers.co.kr/learn/courses/30/lessons/42746
코딩테스트 연습 - 가장 큰 수
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰
programmers.co.kr
내부에서 제공하는 sort() 함수를 써야 시간 복잡도 상 유리한 걸 머리로는 알면서도 어떻게 써야될지 감이 안와서 무식하게 비교했더니 시간 초과가 났다. 당연한 결과지만서도...
def solution(numbers):
answer = ''
while len(numbers) > 0:
max_num = -1
for i in range(len(numbers)):
if str(max_num)*3 < str(numbers[i])*3:
max_num = numbers[i]
numbers.remove(max_num)
answer += str(max_num)
return str(int(answer))
마지막에 str(int(answer)) 해준 이유는 숫자 배열이 [0,0,0,0] 이라고 주어질 때 '0000'이 아니라 '0'으로 나와야해서 정수형으로 바꿔주고 다시 문자열로 바꿔준 것이다. 테케 11번이 이건듯?
문자열에 *3을 해주는건 "3" 이랑 "30" 이랑 비교했을 때 후자가 더 커서 그 부분을 해결해주기 위해 작성했다.
그나저나 이 코드로는 시간 초과가 잡힐 수가 없어서 파이썬 기본 제공 라이브러리 sort함수 + 람다 함수써서 어떻게 하나 검색해봤더니 기가 막히는 코드가 있더라... 어떻게 이렇게 깔끔하게 쓰는지 ㅠㅠ
def solution(numbers):
numbers = list(map(str, numbers))
numbers.sort(key=lambda x: x * 3, reverse=True)
return str(int("".join(numbers)))
위 코드로 하면 깔끔하게 통과한다. join 함수랑 sort 함수에 람다로 넘겨주는 방법에 더 익숙해지자
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스] Lv2 소수 찾기 - python (0) | 2022.07.22 |
---|---|
[프로그래머스] 비밀지도 (0) | 2022.07.02 |
[프로그래머스] 신규 아이디 추천 (python) (0) | 2022.07.01 |
[프로그래머스] 완주하지 못한 선수 (python) (0) | 2022.06.30 |
[프로그래머스] Lv2. 조이스틱 (0) | 2022.04.06 |