[프로그래머스/JavaScript]정렬--가장 큰 수

장현광·2021년 7월 13일
0

알고리즘

목록 보기
7/8
post-thumbnail

#1 가장 큰 수를 만들려면?

머리가 어질어질하네... ㅋㅋㅋ

numbers = [3, 30, 34, 5, 9]일 때,

  1. 첫째 자릿수를 기준으로 내림차순 정렬한다.
  2. 둘째 자릿수를 기준으로 내림차순 정렬한다.
  3. 셋째 자릿수를 기준으로 내림차순 정렬한다.

첫째 혹은 둘째 자릿수가 같을 때, 가령 [3, 30, 34] 내에서만 정렬을 다시 해야 하는데 이걸 못 하겠다.

우선 아래와 같이 작성해보았지만 두번째 sort가 동작하지 않는다.

function solution(numbers) {
    var answer = '';
    
    numbers.sort((a, b) => String(b).slice(0, 1) - String(a).slice(0, 1))
    numbers.sort((a, b) => {
        if(String(a).slice(0, 1) === String(b).slice(0, 1)) {
            String(b).slice(1, 2) - String(a).slice(1, 2)
        }
    })
    
    answer = numbers.join('')
    
    return answer;
}

#2 새로운 정렬방법

이에 대한 해법을 찾아보았는데 새로운 정렬방법을 알게되었다.

// a, b는 문자열로 가정
arr.sort((a, b) => (b + a) - (a + b))

'3''30'이 있을 때,
b + a = '330'a + b = '303'을 비교하여 내림차순으로 정렬한다. 매우 간편하다.
따라서 변경한 알고리즘은 아래와 같다.

function solution(numbers) {
    var answer = '';
    
    numbers.sort((a, b) => (String(b) + String(a)) - (String(a) + String(b)))
    
    answer = numbers.join('')
    
    return answer;
}

헌데, 이렇게 하니 한 가지 오류가 생긴다. 배열이 0으로만 이루어져있을 때이다.
테스트 케이스를 추가하니 다음과 같다.

이 경우는, 인위적으로 '0'을 반환하도록 한다.

#3 최종

function solution(numbers) {
    var answer = '';
    
    numbers.sort((a, b) => (String(b) + String(a)) - (String(a) + String(b)))
    
    answer = numbers.join('')
    
    return answer[0] === "0" ? "0" : answer;
}
profile
프론트!

0개의 댓글