https://programmers.co.kr/learn/courses/30/lessons/42746

 

코딩테스트 연습 - 가장 큰 수

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰

programmers.co.kr


풀이 과정

숫자의 앞자리 수가 큰 순서대로 정답 문자열에 추가하면 될 것 같지만 숫자의 앞자리 수가 같은 숫자를 어떻게 처리할지가 애매하다. 입출력 예 2의 [3, 30, 34, 5, 9]에서 9, 5가 먼저 추가되야 하는것은 명확하지만 3, 30, 34를 34, 3, 30 순서대로 오게 해야할 것 같은데 처리를 어떻게 해줘야 할까?

 

0 <= numbers 원소 <= 1000임을 이용해서 숫자를 str으로 바꿔주고 *3으로 뒤에 같은 숫자를 붙여준 것을 통해 정렬하면 문제를 해결할 수 있다. 왜 *3인가? *2는 안되는가? 일단 *3의 예시를 생각해보면

 

[3, 30, 34, 5, 9] -> ['333', '303030', '343434', '555', '999']이고 이를 통해 왼쪽의 리스트를 정렬하면 [9, 5, 34, 3, 30]이 나오므로 이를 문자열로 합쳐주면 우리가 원하는 답을 얻을 수 있다.

 

[332, 3]을 생각해보자 3332가 이 리스트로 만들 수 있는 가장 큰 문자열이므로 3이 332보다 먼저 와야 한다. *3을 통해 정렬하면

 

[332, 3] -> ['332332332', '333'] 이므로 [3, 332]로 정렬이 된다. 하지만 *2를 통해 정렬하면

 

[332, 3] -> ['332332', '33'] 이 되므로 [332, 3]으로 정렬이 되게 된다. 이를 통해 답을 내면 3323이라는 잘못된 답이 나온다.

 

numbers의 원소가 10000까지 들어온다면 *4를 통해 정렬을 해주어야 할 것이다. 왜인지는 위의 설명과 유사한 반례를 들어 설명할 수 있을 것이다.

 

[0, 0, 0, 0]등의 input값에서 '0000'이라는 결과를 내는 것을 방지하기 위해 답은 int 타입으로 바꿔주었다가 다시 str로 바꿔주어야 한다.


소스 코드

def solution(numbers):
    str_numbers = [str(number) for number in numbers]
    str_numbers.sort(key=lambda x: x*3, reverse=True)
    return str(int(''.join(str_numbers)))

+ Recent posts