https://programmers.co.kr/learn/courses/30/lessons/42746?language=python3#
이 문제에서 핵심은 바로 앞 자리 수가 같은 문자열(수)들을 어떻게 배열하는가이다.
예를 들어
'6', '64', '600', '60'
이 있을 경우,
sorted()
함수에 넣고 오름차순 정렬해주면 ['6', '60', '600', '64']
가 된다.
그러나 가장 큰 수를 만들어 주려면 정렬이 ['6', '64', '60', '600']
이렇게 되어야 한다. 계속 앞자리 수부터 하나씩 뒤로 가면서 숫자가 큰 것이 앞에 와야 하는 것이다.
그렇게 하기 위해
'6' * 3 = '666'
'64' * 3 = '646464'
'60' * 3 = '606060'
'600' * 3 = '600600600'
이렇게 최소 자리 숫자가 한 자리, 최대 자리 숫자가 세 자리 이므로 문자열을 3번 곱해서 그걸 key 값으로 가지고 대소비교를 해주면
sorted(a, key = lambda x:x*3, reverse = True)
['6', '64', '60', '600']
이런 식으로 의도한대로 결과가 도출될 수 있다!!
이걸 염두해두고 풀면 풀린다!
단, [0, 0, 0, 0] 을 입력했을 경우, 정수를 이어 붙여 만들 수 있는 가장 큰 수가 0 인데, 문자열을 단순히 join으로 붙여줬을 경우, '0000'이 출력되어 다시 int()
로 한 번 형변환을 해주고 str()
로 형변환을 해줘서 리턴해줘야 한다!
cf.
문자열을 곱해주면 문자열이 반복되어 나타남!
a = ['6','64','600', '60']
print(a[1]*3) # '666'
def solution(numbers):
for i in range(len(numbers)):
numbers[i] = str(numbers[i])
numbers = sorted(numbers, key = lambda x: x*3, reverse = True)
answer = ''
for i in numbers:
answer += i
return str(int(answer))
def solution(numbers):
for i in range(len(numbers)):
numbers[i] = str(numbers[i])
numbers = sorted(numbers, key = lambda x: x*3, reverse = True)
answer = "".join(numbers) # 리스트의 문자열들을 합치는 역할
return str(int(answer))
"(구분자)".join(리스트)
를 주면 구분자를 두고 리스트의 문자열을 합칠 수 있음!