본문 바로가기

Algorithm

[프로그래머스 Level2] 가장 큰 수

문제 설명

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

 

제한 사항

  • numbers의 길이는 1 이상 100,000 이하입니다.
  • numbers의 원소는 0 이상 1,000 이하입니다.
  • 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.

 

입출력 예

 

 

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

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

programmers.co.kr

 

풀이

def solution(numbers):
    return str(int("".join(sorted(list(map(str, numbers)), key = lambda x: x*3, reverse = True))))

 

1. sorted 함수에서 key 값으로 lambda 함수를 사용하여 정렬을 하는 방법으로, 먼저 numbers의 값들을 map 함수를 통해 문자열(str) 으로 변환하여 준다.

 

2. 1번을 실행하고 key 값 없이 sorted 함수를 적용하면

sorted(list(map(str, numbers)), reverse= True)

[3, 30, 34, 5, 9]는 ['9', '5', '34', '30', '3'] 로 출력된다. 여기서 문제는 9534303이 아니라 9534330이 더 큰 숫자이기 때문에 '30' 앞에 '3'이 정렬되야 한다는 것이다.

 

3. 이를 위해 sorted 함수의 key 값에 x*3 즉, 각 현재 문자열 타입을 가진 숫자들을 3번 반복하여 큰 숫자 순서로 정렬시킨다. (제한사항에 numbers의 원소는 1000이하로 명시되어 있다.)

즉, 999, 555, 343434, 303030, 3 큰 값 순서대로 정렬한다.

 

4. 리스트에서 문자열로 변환시키기 위해 join 함수를 사용한다. 단 이때 주의할 점은, 예를 들어 [0, 0, 0, 0] 의 답은 '0'이 나와야 하는데 '0000'이 나오면 안되기 때문에 int()를 통해 정수로 변환 후 다시 str()을 통해 문자열로 변환해줘야 한다. (테스트 11번 케이스)