-
[프로그래머스 / Python] 가장 큰 수 | 초코더알고리즘/프로그래머스 2020. 1. 9. 17:20
문제 설명
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
제한 사항
-numbers의 길이는 1 이상 100,000 이하입니다.
-numbers의 원소는 0 이상 1,000 이하입니다.
-정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.
입출력 예
numbers
return
[6, 10, 2]
6210
[3, 30, 34, 5, 9]
9534330
접근법
우선 몇가지 함수에 대해 알아볼게요
lambda()
g = lambda x:x**2
g(8)을 프린트 해주면 64가 나옵니다. 람다는 요런식으로 써줍니다.
map()
람다 함수의 장점은 map()함수와 함께 사용될 때 볼 수 있습니다. map()은 두개의 인수를 가지는 함수입니다.
map(str, numbers)를 해주면 numbers안의 모든 요소들을 str함수를 통해 string형태로 바꿔줍니다.
set()
집합 자료형; list에서 중복을 빼고 출력해주는 함수
numbers를 string으로 변환해준 뒤, 각각 요소를 세번출력한 문자열을 큰것부터 정렬합니다.
문자열을 세번씩 출력한 것을 비교해주는 이유는 1000이하의 정수들이므로 가장 자릿수인 일의자릿수를 고려했을때 세번 곱하여 세자릿수로 만들어줍니다. 그리고 그렇다면 문자열 '666'과 '101010'을 비교하면 더 큰 것은 '666' 이 됩니다.
문자열은 국어사전 순처럼 정렬되기 때문입니다!!
나의 코드
def solution(numbers): numbers = list(map(str,numbers)) #numbers안에 모든 요소를 str형태로 바꾼후 다시 list로 저장 numbers.sort(key=lambda x: x * 3, reverse=True) #1000이하의 수니깐 3자리수까지 맞춰줌 if sum(list(map(int,numbers))) == 0: #만약 numbers의 모든수의 합이 0이면 numbers = list(set(numbers)) #numbers에 set(numbers)를 대입 return "".join(numbers) #이어붙인 수를 출력
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 / Python] 올바른 괄호 | 초코더 (0) 2020.08.18 [프로그래머스 / Python] 시저 암호 | 초코더 (1) 2020.01.19 [프로그래머스 / Python] H-Index | 초코더 (0) 2020.01.09 [프로그래머스 / Python] 콜라츠 추측 | 초코더 (0) 2020.01.08 [프로그래머스 / Python] 최대공약수 최소공배수 | 초코더 (0) 2020.01.08