SW
프로그래머스-가장 큰 수
crossfit_wod
2024. 11. 29. 18:36
문제 : https://school.programmers.co.kr/learn/courses/30/lessons/42746#
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
나의 시도(해결 X)
문제를 보자마자 코드를 만들어 봤는데, 시간초과가 발생했다. 아마도 이중for문 때문에 그런 것 같다.
# 가장 큰 수 구하기
# [6, 10, 2] -> [6102, 6210, 1062, 1026, 2610, 2106] -> 3!개수 -> 6102 (가장 큼)
# 1 <= len(numbers) <= 10만
# 0 <= 원소 <= 1000
# [3, 30, 34, 5, 9] -> 5! -> 120개
from itertools import permutations
def solution(numbers):
answer = []
for arr in permutations(numbers, len(numbers)):
temp = ''
for i in range(len(arr)):
temp += str(arr[i])
answer.append(int(temp))
return str(max(answer))
다른 풀이
이 문제에서의 핵심이 되는 부분은 문자열을 정렬할 때, 사전 순으로 정렬을 하는 것이 핵심이다. 다른 방법도 계속 생각해봤지만, 이 개념을 알고 있었다면 빠르게 풀었을 것 같다.
- 문자열을 정렬할 때 사전순이기 때문에 '1' < '10' < '5' < '6' 이렇게 된다.
- 따라서 아래 코드에서 *3을 한 이유 또한 앞자리수 중복을 막고 완전 구분되게 만들기 위함
# 가장 큰 수 구하기
# [6, 10, 2] -> [6102, 6210, 1062, 1026, 2610, 2106] -> 3!개수 -> 6102 (가장 큼)
# 1 <= len(numbers) <= 10만
# 0 <= 원소 <= 1000
# [3, 30, 34, 5, 9] -> 5! -> 120개
def solution(numbers):
zeroCount = 0
for n in numbers:
if n == 0:
zeroCount += 1
if zeroCount == len(numbers):
return "0"
temp = list(map(str, numbers))
temp.sort(key = lambda x: x * 3)
answer = ''
for i in range(len(temp) - 1, -1, -1):
answer += temp[i]
return answer