프로그래머스 - 가장 큰 수

Lellow_Mellow·2023년 7월 7일
1
post-thumbnail

✨ Lv. 2 - 가장 큰 수

문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/42746

문제 설명

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

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

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


제한사항

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

풀이 코드 + 설명

처음에는 단순히 localeCompare를 활용하여 문자열끼리 비교를 통해 정렬하여 join하는 방식을 생각하였습니다. 다만, localeCompare을 활용한 정렬 결과는 우리가 구하고자 하는 숫자의 조건과 맞지 않습니다.

[ 우리가 구하고자 하는 수 ]

  • 주어진 정수를 이어 붙여 만들 수 있는 가장 큰 수
  • 그렇다면 정렬 기준이 달라야하지 않을까?
  • 두 수를 이어 붙였을 때, 더 큰 수가 되는 순서대로 정렬해보자.

따라서 아래와 같이 코드를 작성해 정렬하여 return 하였습니다. 다만, 주어진 숫자가 전부 0일 경우를 고려하여 return 문을 작성하였습니다.

function solution(numbers) {
    let result = numbers.sort((a, b) => {
        if(+`${a}${b}` > +`${b}${a}`) return -1;
        if(+`${a}${b}` < +`${b}${a}`) return 1;
    }).join('');
    
    return result.split('').filter((v) => v !== '0').length ? result : '0';
}

return 문은 result의 가장 앞쪽에 위치한 값을 이용하여 더 간단하게 작성할 수 있습니다. 만약 가장 앞에 위치한 값이 0 이라면, 가장 큰 값이 0이라는 의미이기 때문에 해당 입력값은 전부 0이라 판단할 수 있습니다. 이를 이용하여 수정한 코드는 아래와 같습니다.

function solution(numbers) {
    let result = numbers.sort((a, b) => {
        if(+`${a}${b}` > +`${b}${a}`) return -1;
        if(+`${a}${b}` < +`${b}${a}`) return 1;
    }).join('');
    
    return result[0] !== '0' ? result : '0';
}

profile
잔잔한 물결에서 파도로, 도약을 위한 도전. 함께하는 성장

0개의 댓글