[프로그래머스] LV 2. 가장 큰 수

김민철·2020년 12월 3일
1

푼 날짜 : 2020. 11 . 6
문제 링크 : 가장 큰 수

문제 설명

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'의 자리를 비교합니다.

둘째, '1'의 자리에 숫자가 있으면 '0'의 자리와 비교합니다.

셋째, '1'의 자리 숫자가 '0'의 자리 숫자보다 큰 경우가 우선합니다

넷째, '1'의 자리 숫자가 없는 수 이더라도 '1'의 자리 숫자가 '0'의 자리 숫자보다 낮은 수보다 우선합니다.

(예를들어, {30, 34 ,3} → 34330}

이를 위해 요소들의 0의 자리수와 요소들을 짝 지어서 리스트 만들고 중복값들 순서를 바꿔주려했습니다. 하지만 실패. 중복값들만 따로 빼는 것 부터 실패했습니다.

두번째

숫자인 문자열의 크기 비교를 제가 몰랐습니다.

"303" 보다 "33" 이 문자열에서는 더 큰 수 였습니다.

그걸 안 후에는 간단했습니다.

문자열 요소들을 3번 반복시켜서 재정렬합니다. 그러면 어떤 요소가 앞에 와야하는지 분간이 됩니다.
제출하고 보니 d =[] 라는 리스트를 만들지 않고 바로 문자열 더하는 식으로 풀 수도 있었습니다. 그러면 join도 쓰지 않을 수 있었습니다.
이 풀이로 문제를 통과했습니다.

세번째

블로그를 쓰기 위해 다시 풀어봤습니다. i*3 을 곱해서 revere 출력하는 부분을 lambda를 이용하면 간단하게 표현할 수 있겠다는 생각이 들었습니다.

lambda가 들어간 코드는 'b라는 리스트에서 각 요소를 x번 반복한 값들로 비교하여 내림차순 정렬하라' 는 의미입니다.
lambda 를 사용하면 어떠한 기준을 잡아서 재정렬할때 유용합니다.


다른사람 풀이

숫자의 리스트를 문자의 리스트로 map 을 사용해 쉽게 바꿨습니다.
또한 저는 numbers가 [0,0,0,,,0] 이 주어질 경우를 따로 빼서 코드를 썼지만, 이 풀이는 int 로 변환하고 다시 str 로 변환하면서 한 번에 처리할 수 있게 하였습니다.
map은 리스트의 요소를 지정된 함수로 처리해주는 함수입니다. 리스트의 요소들을 처리하는 경우만 보면 for 문이 먼저 떠올라 map 이 익숙지 않지만, 이 방식 또한 곧 익숙해질거라 생각합니다.

0개의 댓글