[pro] 가장 큰 수

문제링크

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))

"".join(리스트) : 리스트의 문자열을 합쳐주는 역할 함수

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(리스트)를 주면 구분자를 두고 리스트의 문자열을 합칠 수 있음!

좋은 웹페이지 즐겨찾기