본문 바로가기
ALGORITHM/프로그래머스 With JS

[프로그래머스] 가장 큰 수 / Javascript

by LAY CODER 2021. 5. 2.

문제

 

코딩테스트 연습 - 가장 큰 수

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰

programmers.co.kr


 

TRY

function solution(numbers) {

    // 모든 number들을 string으로 바꿔주고 문자열을 그대로 연결한 수(b+a) - 바꿔 연결한 수(a+b)가 양수이면
    // ex) b(3) + a(30) - a(30) + b(3) => 330 - 303 = 양수
    // 3 30 순서를 그대로 유지한다.
    
    let temp = numbers.map((a) => String(a)).sort((a, b) => b + a - (a + b));

    // 모든 숫자가 0인 경우 000 이 나오지 않게 0을 출력
    if (temp.every((a) => a === '0')) {
        return '0';
    } else {
        return temp.join('');
    }
}

console.log(solution([6, 10, 2]));
console.log(solution([3, 30, 34, 5, 9]));
console.log(solution([0, 0, 0]));

숫자들을 String으로 바꾼 다음 문자열을 연결했을 때 큰 순서대로 Array.sort()를 해준다.

 

Array.sort()는 return하는 값이 양수이면 순서를 그대로 유지하고 음수이면 순서를 바꿔준다.

 

문자열을 그대로 연결한수(b+a) - 바꿔 연결한 수(a+b)를 통해 문자열을 연결했을 때 큰 순서대로 배열을 정렬하고

 

모든 숫자가 0인 경우를 Array.every() 함수를 사용하여 0으로 바꿔준다.

 

0이 아닌경우는 Array.join()을 이용하여 배열을 문자열로 바꿔주고 출력한다.


 

Refactoring

function solution(numbers) {

    // 모든 number들을 string으로 바꿔주고 문자열을 그대로 연결한 수(b+a) - 바꿔 연결한 수(a+b)가 양수이면
    // ex) b(3) + a(30) - a(30) + b(3) => 330 - 303 = 양수
    // 3 30 순서를 그대로 유지한다.
    let answer = numbers
        .map((a) => String(a))
        .sort((a, b) => b + a - (a + b))
        .join('');

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

console.log(solution([6, 10, 2]));
console.log(solution([3, 30, 34, 5, 9]));
console.log(solution([0, 0, 0]));

 

첫 풀이와 똑같지만 Array.every()를 사용하지 않고 내림차순으로 배열을 정렬했기에 앞자리가 0인경우

 

모든 인자가 0이라는 걸 알 수 있어서 삼항연산자를 이용하여

 

첫번째 인자가 0인 경우 0을 출력하고 아닌경우 answer를 출력하도록 바꿔주었다.

댓글