본문 바로가기

코딩테스트

[프로그래머스]level2. 가장 큰 수 (javascript)

반응형

문제

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

나의 풀이

방법1(오답)

function solution(numbers) {
    const arr = numbers.map((el,idx)=> {
        if (el >= 10){
            while(el >= 10){
                el = el/10
            }
        }
        return {'el':el,index:idx}
    })

    return arr.sort((a,b)=>b.el-a.el)
                .reduce((acc,ele)=> acc += numbers[ele.index]+(""),"")

}

 

30이랑 3이 같은 수가 되버린다. => 실패

 

방법2. 재귀함수(오답)

function solution(numbers) {
    var answer = '';

    function re (arr,selectnum){
        const result = [];
        if (selectnum == 1) return arr.map((el)=>[el]);

        arr.forEach((fixed,index,origin)=>{
            const nextarr = [...origin.slice(0,index),...origin.slice(index+1)]
            const combinations = re(nextarr,selectnum-1)
            const attached = combinations.map((combination)=>[fixed,...combination]);
            result.push(...attached);
        })
        return result
    }
    const fin = re(numbers,numbers.length)

    return fin.map((el)=>el.join("")).sort((a,b)=>b-a)[0]
}

런타임 에러

 

다른이들의 정답

방법1

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;
}

 

개뻘짓했다..
문자열을 두개를 붙여서 비교할 생각조차 못했다..
문자열을 곱셈해줌으로써 숫자로 변환해줬다......

 

방법2

function solution(numbers) {
    let answer = numbers.sort((a, b) => `${b}${a}` - `${a}${b}`).join('');
    return answer[0] === '0' ? '0' : answer;
}

참조 : $ 사용법

반응형