프로그래머스 LV2 #10 가장 큰 수

Jake Seo·2020년 8월 11일
0

프로그래머스 LV2

목록 보기
10/10

프로그래머스 LV2 #10 가장 큰 수

문제

풀이

let solution = num => (num = num.map(n=>""+n).sort((a,b) => (+(b+a))-(+(a+b))).join(""))[0] === '0' ? '0' : num;

이 문제는 정렬문제인데 여러 개의 숫자 조각으로 큰 수를 만드는 규칙을 생각하면서 풀면 된다.

가장 핵심적인 아이디어는 자릿수에 관한 아이디어다.

일반적인 수 비교를 하고 수가 크다고해서 앞으로 오는 것이 아니다.

입출력 예 1번에서 이를테면 610이 있는데, 6이 앞으로 와야 큰 수를 만들 수 있다.

610으로 만들 수 있는 수를 생각해보면 610 106이 있다.

이말인 즉, 수 전체를 보는 것이 아니라 자릿수 하나의 숫자를 기준으로 배치를 결정해야 한다는 것이다.

610에서는 6 1을 기준으로 봐야한다.

그러면 당연히 6이 크다.

그러면 숫자의 일정 부분까지는 똑같은데 뒷부분이 다르다면?

위의 입출력 예 2번에서는 30334가 있다. 이 경우에는 앞의 3들은 같은데, 뒤의 숫자가 다르다. 어떻게 판별해야 할까?

3과 30

330을 자릿수대로 비교하려하면 33이 먼저 비교되고 다음에 앞의 수의 두번째 자릿수와 0을 비교해야하는데 3에는 두번째 자릿수가 없다.

이 때 다시한번 자릿수에 관한 아이디어를 기반으로 배치를 생각해보면...

330을 배치했을 때 330이 가능하고, 303이 가능하다.

그러면 330이 더 큰 숫자기 때문에 330이 나오는 방향으로 로직을 잡아야 한다.

3이 먼저 나와야 하는데 어떤 근거로 3을 먼저 가져가느냐가 중요하다.

3과 34

또 다른 숫자인 334도 있다. 이 경우에는 어떤 숫자가 먼저 나와야 할까?

이 두 숫자로 만들 수 있는 것은 334343이 있다. 그러면 34가 먼저 와야 큰 수가 된다는 것을 알 수 있다.

자릿수를 맞춘 후에 큰 것이 먼저오는 방식으로 해결하자

위 두 경우 334 그리고 330

공통적으로 고려해야 하는 부분은 '어떤 수가 먼저 와야 앞 자리수에 큰 수가 올까?' 이다.

결국에는 정렬하는 부분에서 해보면 된다.

숫자로 된 문자열 두개 a,b가 있다면 ab를 순서대로 합쳐보고 ba도 순서대로 합쳐보고 큰걸 앞으로 빼면 된다

let solution = num => (num = num.map(n=>""+n).sort((a,b) => (+(b+a))-(+(a+b))).join(""))[0] === '0' ? '0' : num;

순서대로 합쳐보고 큰 것을 앞으로 빼자

profile
풀스택 웹개발자로 일하고 있는 Jake Seo입니다. 주로 Jake Seo라는 닉네임을 많이 씁니다. 프론트엔드: Javascript, React 백엔드: Spring Framework에 관심이 있습니다.

0개의 댓글