프로그래머스 - 가장 큰 수

아놀드·2021년 8월 18일
0

프로그래머스

목록 보기
16/52

1. 문제

문제 링크

2. 풀이

당장 떠오르는 방법은 모든 숫자 조합을 만들어서 그 중에 가장 큰 값을 반환하는 겁니다.
하지만 경우의 수가 (numbers.length)!개나 있기 때문에 시간 초과가 날 게 뻔하죠.

현명하게 이 문제를 해결하는 방법을 생각해봅시다.
결국 반환되는 값은 numbers의 원소들로 이루어져있고
이 원소들을 특정한 규칙에 의해 '정렬'시키면
우리가 원하는 답으로 이끌어낼 수 있습니다.

[9, 30, 5]를 정렬할 때
오름차순일 땐 [5, 9, 30]
내림차순일 땐 [30, 9, 5] 의 결과가 나오지만
우리가 원하는 결과는 [9, 5, 30]입니다.

보통 오름차순, 내림차순 정렬할 땐
두 수를 그저 대소 비교합니다.
예를 들어 [9, 30]을 내림차순 정렬했을 때
930을 비교시 9 < 30이기 때문에 [30, 9]가 결과로 나옵니다.

우리가 원하는 정렬을 위해선
단순 대소 비교는 쓸 수 없고
큰 수를 만들기 위해 두 수를 조합해서 어떤 수가 앞으로 와야할 지 기준으로 정렬을 시켜야합니다.
[9, 30]일 때 두 수를 서로 이어붙여서 하나는 930 하나는 309로 만들어주는 겁니다.
그리고 이어붙인 두 수를 비교하면 930 > 309가 되니까 결과는 그대로 [3, 30]이 됩니다.

단순 버블 정렬을 한다 생각했을 때
우리가 원하는 답의 형태로 만들어질 때까지
인접한 두 수를 우리가 찾아낸 규칙으로 정렬을 시키기 때문에
[9, 30, 5][9, 5, 30]이 됩니다.

3. 전체 코드

function solution(numbers) {
    return numbers.reduce((a, b) => a + b) 
            ? numbers.sort((a, b) => ('' + b + a) * 1 - ('' + a + b) * 1).join('') 
            : '0';
}

numbers의 모든 요소가 0인 경우는 예외처리합니다.

profile
함수형 프로그래밍, 자바스크립트에 관심이 많습니다.

0개의 댓글