[JavaScript][Programmers] 가장 큰 수

조준형·2021년 7월 2일
0

Algorithm

목록 보기
9/142
post-thumbnail

🔎 가장 큰 수

❓ 문제링크

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

📄 제출 코드


let result = [];
// let numbers = [0, 0, 0, 1];

function solution(numbers) {
    numbers.sort();
    let res = [];
    for (var i = 0; i < numbers.length; i++) {
        res.push(numbers[i].toString());
    }
    
    res.sort((a, b) => {
        return (b + a) - (a + b);
    })
    var answer = res.join('');
    //console.log(parseInt(answer));
    if (parseInt(answer) == 0) answer = '0';
    
    return answer;
}

핵심은

res.sort((a, b) => {
        return (b + a) - (a + b);
    })

이 부분이다.
두 문자를 연결해서 더 큰 걸 리턴한다.
[3, 30]의 경우 303과 330을 비교해서 내림차순 리턴.

위의 sort는 숫자를 비교하였다.
하지만 문제에서 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다. 라는 조건이 있다.
그래서 join을 이용하여 문자열로 바꾸고 답을 출력한다.

🎲 리팩토링

📄 초기 코드

let result = [];

let numbers = [3, 30, 444, 34, 5, 9]
function solution(numbers) {
    numbers.sort();
    let result = '';
    console.log(numbers);
    let res = [];
    for (var i = 0; i < numbers.length; i++) {
        res.push(numbers[i].toString());
    }
    
    console.log(res);
    for (var i = res.length - 1; i >= 0; i--) {
        if (i !=0 && res[i].length > res[i - 1].length) {
            let temp = res[i];
            res[i] = res[i - 1];
            res[i - 1] = temp;
        }
        console.log(res);
        result += res[i];
    }

    return result;
}

👉 1. sort후 연결.

가장 먼저 순열을 생각하다가 정답case를 보면 [6,10,2]의 경우 6210으로 앞의 자릿수가 큰 게 먼저 나온다.
그냥 sort를 하게되면 숫자가 문자열취급되어 정렬이되어 [10,2,6]이 되니까 뒤에서 부터 연결하였다.
그리고, 두번째 testcase의 경우 3가 30에서 303이 출력되어 앞뒤로 문자 길이를 비교해서 큰 경우 위치를 바꿔 출력하려 하였다.
(작성하면서 보니 단순히 길이만 비교하고, 앞자리 숫자 크기조차 비교안했네? ;;;)
역시나 바로 실패하였고, 이유는 바로 찾았다.

let numbers = [3, 30, 444, 34, 5, 9]

이 경우 444가 중간이 아닌 젤 마지막에 들어가게 된다.

👉 2. 자릿수 연결 후 비교.

그 다음 sort에 대해서 좀 더 읽어보고, 두 숫자를 연결해서 비교하는 걸 찾았다.

function solution(numbers) {
    numbers.sort();
    let res = [];
    for (var i = 0; i < numbers.length; i++) {
        res.push(numbers[i].toString());
    }
    
    res.sort((a, b) => {
        return (b + a) - (a + b);
    })

    return res.join('');
}

비교 전에 문자열로 변경하여 res배열에 담고, 비교하였다.
하지만 위의 경우 11번째 testcase에서 실패가 떳다.
질문게시판을 찾아보니 0인 경우가 있다더라.
let numbers = [0, 0, 0]의 경우 000으로 출력이 된다.

👉 3. 0 처리

if (parseInt(answer) == 0) answer = 0;

문자열 answer를 int로 변경 후 0이면 0으로 변경하였다.
하지만 한번 더 실패가 발생한다.
왤까 생각하면서 문제를 다시 읽다보니 조건에 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.라는 구문이 있다.

if (parseInt(answer) == 0) answer = '0';

로 변경하니 통과하였다.
조건을 잘 읽자..

👉 4. 다른 방법

나는 result라는 새 배열에 toString으로 숫자값을 string으로 바꿔 넣어서 결과를 도출했는데, 많은 사람들이 map()을 이용하였다.

var answer = numbers.map(c => c + '').sort((a, b) => (b + a) - (a + b)).join('');

map()은 안의 식을 적용한 새로운 배열을 만들어 준다.
+''을 하여서 문자열로 바뀐듯 하다.
그후 join을 하여 문자열로 만들어주었다.

그 다음 0처리는 3항연산자를 이용한다.

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

이렇게 적용하면 두 줄로 줄일 수 있다.
대단한 사람들..

📘 참고

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
가장 큰 수 - 정답게시판 (풀고나면 접근 가능)

profile
깃허브 : github.com/JuneHyung

0개의 댓글