가장 큰 수

황순은·2021년 4월 2일
0

Algorithm

목록 보기
4/16
post-thumbnail

든든한 친구

나에겐 이미 개발자로 왕성한 활동을 하는 친구가 있다. 덕분에 개발자가 되어야겠다는 생각을 더 굳힐 수 있었고, 고민이 생길 때마다 부담 없이 물어볼 수 있는 개발자가 주위에 있다는 것으로 항상 든든하다. 하지만 처음부터 모르는 거 있으면 물어보지 말고 구글링해서 찾아서 네 걸로 만들어라 라는 충고를 나에게 해준 탓에 자주 질문은 하지 않는다^^;

대신에 친구는 나의 문제해결능력 향상(내 뚝배기 털기)하기 위해 프로그래머스에서 본인이 엄선한 문제를 과제로 나에게 제공해준다. 그중 첫 번째 문제가 프로그래머스의 가장 큰 수였다.

1. 문제 설명

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

제한 사항

numbers의 길이는 1 이상 100,000 이하입니다.
numbers의 원소는 0 이상 1,000 이하입니다.
정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.

입출력 예

2. 이해

문제를 살펴보면 할 일이 많은 것을 알 수 있다. numbers의 원소에 [98, 9]가 있다고 가정을 한다면 첫 번째로 와야 하는 요소는 9이다. 왜냐하면, 9 다음 99가 올 수도 있다는 가정을 해야 풀 수 있는 문제기 때문이다. 다음 예로 [8, 89]는 89가 먼저와야 한다는 것. 잘 생각해 보면 알 수 있다. 그리고 문제에 답이 있다. 이것을 생각해내는 데는 나는 엄청나게 긴 시간이 걸렸지만.. 여튼 망치로 머리를 몇 대 맞은 기분이 들면서 배우지 못한 정렬에 대해서 생각해볼 필요가 있었다.

// 내코드
function solution(numbers) {
   var answer = '';
    let arr = [];
    for(let i = 0; i <= 1000; i++){
        arr.push(i + '');
       // 1부터 1000까지의 순서대로 문자열로 넣어준다.
    }
    for(let i = 0; i < 1000; i++){
        for(let j = 0; j < 1000; j++){
            if (arr[j + 1] + arr[j] > arr[j] + arr[j + 1]) {
               // 문자열을 더해준 값으로 비교하며 정렬해주면 위에말한 조건을 충족하는
               // 배열로 만들 수 있다.
                let sarr = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = sarr;
            }
        }
    }
    for(let i = 0; i < arr.length; i++){
        for(let j = 0; j < numbers.length; j++){
            if(Number(arr[i]) === numbers[j]){
                answer = answer + arr[i];
              // arr에는 인덱스0부터 순서대로 가장큰수를 구성할 수 있는 요소로
              // 정렬되어 있기 때문에 arr을 순서대로 살펴보며 numbers[j]가 있다면
              // 해당 numbers[j]를 먼저 넣어준다.
            }
        }
    }
    if (answer[0] === '0') return '0';
    return answer;
}

참 어렵게 풀었다... 다음은 레퍼런스 코드다.

// reference
function solution(numbers) {
    var answer = '';
    answer = numbers.map(num => num + '').sort((a,b) => (b+a)*1 - (a+b)*1).join('');

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

?? 뭐가 이렇게 간단한거죠? 짬나는 시간에 리팩토링 해보자.

3. 정리

이 문제는 코드스테이츠 2주차에 풀 수 있었다. 한 문제에 많은 시간을 들여서 풀었지만 여러 가지 시도를 해보며 풀어본 문제였고 다른 문제를 풀 때도 조금 더 다양한 접근이 가능하게 되었다. 개발자 친구가 그랬다. 어려운 문제를 고민해서 풀면 풀수록 실력은 기하급수적으로 상승한다고. (머리가 깨지고 또 깨져봐야 한다는 소리로 들렸다)

GitHub repo

profile
안녕하세요.

0개의 댓글