프로그래머스 LV2 #10 가장 큰 수
let solution = num => (num = num.map(n=>""+n).sort((a,b) => (+(b+a))-(+(a+b))).join(""))[0] === '0' ? '0' : num;
이 문제는 정렬문제인데 여러 개의 숫자 조각으로 큰 수를 만드는 규칙을 생각하면서 풀면 된다.
일반적인 수 비교를 하고 수가 크다고해서 앞으로 오는 것이 아니다.
입출력 예 1번에서 이를테면 6
과 10
이 있는데, 6
이 앞으로 와야 큰 수를 만들 수 있다.
6
과 10
으로 만들 수 있는 수를 생각해보면 610
106
이 있다.
이말인 즉, 수 전체를 보는 것이 아니라 자릿수 하나의 숫자를 기준으로 배치를 결정해야 한다는 것이다.
6
과 10
에서는 6
1
을 기준으로 봐야한다.
그러면 당연히 6
이 크다.
위의 입출력 예 2번에서는 30
과 3
과 34
가 있다. 이 경우에는 앞의 3
들은 같은데, 뒤의 숫자가 다르다. 어떻게 판별해야 할까?
3
과 30
을 자릿수대로 비교하려하면 3
과 3
이 먼저 비교되고 다음에 앞의 수의 두번째 자릿수와 0
을 비교해야하는데 3
에는 두번째 자릿수가 없다.
이 때 다시한번 자릿수에 관한 아이디어를 기반으로 배치를 생각해보면...
3
과 30
을 배치했을 때 330
이 가능하고, 303
이 가능하다.
그러면 330
이 더 큰 숫자기 때문에 330
이 나오는 방향으로 로직을 잡아야 한다.
3
이 먼저 나와야 하는데 어떤 근거로 3
을 먼저 가져가느냐가 중요하다.
또 다른 숫자인 3
과 34
도 있다. 이 경우에는 어떤 숫자가 먼저 나와야 할까?
이 두 숫자로 만들 수 있는 것은 334
와 343
이 있다. 그러면 34
가 먼저 와야 큰 수가 된다는 것을 알 수 있다.
위 두 경우 3
과 34
그리고 3
과 30
공통적으로 고려해야 하는 부분은 '어떤 수가 먼저 와야 앞 자리수에 큰 수가 올까?' 이다.
결국에는 정렬하는 부분에서 해보면 된다.
숫자로 된 문자열 두개 a
,b
가 있다면 ab
를 순서대로 합쳐보고 ba
도 순서대로 합쳐보고 큰걸 앞으로 빼면 된다
let solution = num => (num = num.map(n=>""+n).sort((a,b) => (+(b+a))-(+(a+b))).join(""))[0] === '0' ? '0' : num;
순서대로 합쳐보고 큰 것을 앞으로 빼자