프로그래머스 가장 큰 수 구하기

문제 링크

 

"Shiba Inu, from Harry potter and the chamber of secrets (2002)" from DALL-E 2

 

[방법]

  • 배열의 원소들을 순회하면서 가장 큰 자릿수를 구한다. 각 배열의 원소를 해당 크기의 자릿수만큼 늘리고, 자릿수가 변경되면서 생긴 자릿수 값은 해당 원소의 원본 값에서 가장 큰 자릿수의 값으로 할당한다. 예를 들어, 원소 41이 있고 가장 큰 자릿수가 3이라면 41을 414로 변경한다.
  • 새로운 배열에 대해 내림차순으로 정렬하고, 같은 값을 가질 경우 원본 값에서 1의 자릿수 값을 비교하여 결정한다.
  • 정렬된 배열의 원본 값을 순서대로 이어붙이면서 결과 값을 완성한다.

 

[테스트 케이스]

  • 41과 414가 주어졌을 때, 41441이 나와야 한다.
  • 89와 898이 주어졌을 때, 89898이 나와야 한다.

[소스코드]

function solution(numbers) {
    let answer = '';
 
    let maxLength = 1;
    let sizeArr = [];
    for(let number of numbers){
        let cnt = 0;
        while(number !== 0){
            number = Math.floor(number / 10);
            cnt++;
        }
        sizeArr.push(cnt);
        if(cnt > maxLength) maxLength = cnt;
    }
 
    let arr = [];
 
    for(let i=0;i<numbers.length;i++){
        let diff = maxLength - sizeArr[i];
        let number = numbers[i];
        let data = {
            key: number * Math.pow(10, diff),
            value: number
        };
        let addValue = number;
        while(true){
            if(Math.floor(addValue / 10) === 0) break;
            addValue = Math.floor(addValue / 10);
        }
        for(let j=0;j<diff;j++){
            data.key += addValue * Math.pow(10, j);
        }
        arr.push(data);
    }
 
    arr.sort((a,b) => {
        if(a.key === b.key){
            return (b.value % 10) - (a.value % 10);
        } else {
            return b.key - a.key;
        }
    });
 
    if(arr[0].value === 0){
        return '0';
    }
 
    for(let item of arr){
        answer += String(item.value);
    }
 
    return answer;
}