본문 바로가기
Study Note/Algorithm

프로그래머스 #정렬 - 가장 큰 수 lv2

by 시뮝 2021. 1. 23.
728x90

 

 

제출 답안

function solution(numbers) {
    let answer = '', i, numbers_sort = [], number;
    
    if(Math.max(...numbers)===0) {
        return '0';
    }
    
    for(i=0; i<numbers.length; i++) {
        number = numbers[i];
        numbers_sort.push([String(number).padEnd(4, number), number]);
    }
    numbers_sort.sort().reverse();
    
    answer = [...numbers_sort.map(n=>n[1])].join('')
    
    return answer;
}

 

풀이 과정

0만 들어 오는 경우 "0000" 으로 반환될 우려가 있으므로 제일 첫 부분에 체크하는 조건문을 작성하였다.

 

1000이하의 수가 주어진다는 점을 응용할 방법이 없을까 찾아보던 중 숫자를 반복하여 4자리 수로 만들면 된다는 사실을 알아내었다. 그 부분만 차용하여 문자열 내림차순으로 정렬시켰고 결과는 주어진 숫자를 join() 하여 return 하도록 하였다.

 

다른 사람들의 풀이 분석

다른 사람들의 풀이를 살펴보니 javascript 의 sort() 함수내에서 앞뒤 문자열 중 큰 값을 비교하여 정렬하는 방법이 있더랬다 ㅠㅠ (그럼 테스트 통과 시간이 더 빨라졌을텐데!!) 궁금한건 참지 못하니 다른 분의 답안을 돌려보기로 했다.

function solution(numbers) {
    var answer = numbers.map(v=>v+'')
                        .sort((a,b) => (b+a)*1 - (a+b)*1)
                        .join('');

    return answer[0]==='0'?'0':answer;
}

성능이 두 배 가까이 차이가 난다. map의 v+''이 숫자를 문자로 바꾸고 sort에선 앞뒤 정렬기준을 두 수를 합하였을 때 큰 수를 출력토록 한 것이다. 이 때 숫자로 되돌려 주기 위해 *1까지 해주고 return 할 땐 '000~'을 방지하는 코드까지 ㅠㅠ 다른 분들의 풀이를 보며 깨닫는게 많아진다.

728x90

댓글