[프로그래머스] Lv2 - 가장 큰 수

제리·2021년 1월 20일
0

프로그래머스

목록 보기
24/25

https://programmers.co.kr/learn/courses/30/lessons/42746#

function solution(numbers) {
    var answer = '';
    var maxLength = 4
    
    numbers = numbers.map(number=>number.toString())

    numbers = numbers.map(number=>{
        let cpy = number
        if(number.length < maxLength){
            let dist = maxLength - number.length
            let first = cpy[0]
            for(let i = 0; i < dist; i++){
                cpy += first
            }
        }
        return {
            original:number,
            temp:parseInt(cpy)
        }
    })
    
    let sorted = numbers.sort((a,b)=>{
        if(a.temp == b.temp){
            let case1 = parseInt(a.original + b.original)
            let case2 = parseInt(b.original + a.original)
            
            return case2 - case1
        }
        else return b.temp - a.temp
    })
    
    answer = numbers.reduce((accumulator, currentValue) => accumulator + currentValue.original,"");


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

각 수들은 자리수가 다 다르기 때문에 정렬을해서 우선순위를 매기기가 어렵다.
따라서 형평성(?)있게 정렬하는 방법을 고안해냈다.
그방법은 자리수를 모두 4자리로 바꾸었고 부족한 자릿수는 수의 맨 앞에값을 넣어주었다.
예시) 31 -> 3133, 2 -> 2222 10 -> 1011
이렇게 해준이유는 해당하는 수를 어떤 수의 뒤에 붙였을때 수의 맨 앞에 값에 영향을 받기 때문이다.
예를 들면 100과 10이 있을때 1001, 1011로 바꿀 수 있고 내림차순 정렬하면 1011,1001이 되서 답이 10100이 된다.
하지만 여기서 문제는 402,4024가 있을때 변환하면 4024, 4024 이므로 4024024가 반환될 우려가 있다.(실제답은 4024402)
따라서 변환된 값이 같을때는 서로 이어붙여서 큰 값을 반환하는 쪽으로 정렬해주면된다.
마지막으로 문자열을 이어붙이다보니 "00000"이런 수가 나올 수 있기때문에 맨앞이 0이면 '0'을 반환해주면된다.
끝!

profile
흐릿한 잉크가 뚜렷한 기억보다 낫다

0개의 댓글