자료구조와 알고리즘/programmers

정렬 > 가장 큰 수

최문경 블로그 2021. 6. 17. 16:19

문제

 

 

풀이

function solution(numbers) {
    numbers.sort();
    for (let i = numbers.length - 1; i > 0; i--) {
        const lNumStr = numbers[i - 1].toString();
        const rNumStr = numbers[i].toString();
        if (lNumStr.charAt(0) === rNumStr.charAt(0)) {
            const case1 = lNumStr + rNumStr;
            const case2 = rNumStr + lNumStr;
            if (+case1 > +case2) {
                // 순서 교체
                let temp = numbers[i - 1];
                numbers[i - 1] = numbers[i];
                numbers[i] = temp;
            }
        }
    }
    
    let answer = '';
    
    numbers.reverse();
    for (let number of numbers) {
        answer += number.toString();
    }
    
    return answer;
}

먼저 numbers배열을 인자없이 sort() 정렬하고 반복문을 돌면서 인접한 두 수의 첫째자리 수를 비교하여 다르면 넘어가고 같다면 두 수를 어떤 순서로 붙였을 때 더 큰 수가 나오는지 확인한다음 더 큰 수가 나오도록 자리를 교체했다.

 

 

결과

왜 대부분의 테스트에서 통과하지 못했을까 생각하며 다시 코드를 보니.. 순서를 교체하고 난 뒤에 다시 순서를 정렬했을 때 더 큰 수가 나올 수도 있다는 사실을 간과하고 코드를 짰다.

 

 

다른 사람의 풀이

function solution(numbers) {
    const answer = numbers
        .map(n => n.toString())
        .sort((a, b) => (b + a) - (a + b))
        .join('');

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

sort를 사용해 숫자로 이루어진 문자열도 정렬할 수 있다는 사실과 compareFunction을 (a, b) => (b + a) - (a + b)와 같이 사용할 수 있음을 배웠다..

'자료구조와 알고리즘 > programmers' 카테고리의 다른 글

정렬 > K번째 수  (0) 2021.06.15